Linux:基础开发工具(六)

今天我们来讲gdb与cgdb调试器,作为我们基础开发工具终章,这个难度可想而知,不过不要着急,我会带着你一步一步使用它

因为cgdb是gdb的升级版,所以我们主要使用cgdb

我们开始cgdb学习(>.<)

准备事项

1.cgdb安装

使用下面的代码进行cgdb安装

sudo yum install -y cgdb

这里我已经安装过了,所以出现了Nothing to do

2.测试代码编写

code.c复制下面代码即可,Makefile希望大家自己编写巩固Makefile知识

cpp 复制代码
#include <stdio.h>    
    
int Sum(int s, int e)    
{    
    int result = 0;    
    for(int i = s; i <= e; i++)    
    {    
        result += i;    
    }    
    return result;                                                                                                                                                                                               
}    
    
int main()    
{    
    int start = 1;    
    int end = 100;    
    printf("I will begin\n");    
    int n = Sum(start, end);    
    printf("running done, result is: [%d-%d]=%d\n", start, end, n);    
    return 0;    
}

调试选择(release与debug)

• 程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程

序,默认是 release 模式。

• 要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被编译

默认release模式,且为了支持代码里面for(int 初始化)我们需要使用c99标准(-std=c99)

加上-g生成可调式程序code,发现debug模式下code的内存更大(8520 < 9792)

使用cgdb开始调试

1.开始: gdb binFile

2.退出: ctrl + d 或 quit 调试命令

3.显示源代码:l/list

一般用得不多,因为cgdb已经帮助我们显示出来了

显⽰源代码,从上次位置开始,每次列出10⾏ :l/list 10

list/l 函数名

列出指定函数的源代码 : list/l main

list/l ⽂件名:⾏号

列出指定⽂件的源代码 : list/l mycmd.c:1

4.在指定⾏号设置断点 : break/b ⽂件名:⾏号

断点处行号将变成红色

5.查看当前所有断点的信息 : info break/b
6.从程序开始连续执⾏ : r/run

没有断点直接运行到结束(上述是没加断点的情况),有断点运行到断点(下面是有断点的情况,运行到17),然后开始n/s调试

7.单步执⾏,不进⼊函数内部,类似vs2022逐过程 F10 : n/next
8.单步执⾏,进⼊函数内部, 逐语句 F11 : s/step
9.finish执⾏到当前函数(局部函数,main函数里面用不了)返回,然后停⽌
10.删除所有断点 : delete/d breakpoints
11.删除序号为n的断点 : delete/d breakpoints n
12.禁用所有断点 : disable breakpoints(不是删除)

从y变成n了

13.启⽤所有断点 : enable breakpoints
14.特定断点禁用与启用 : disable breakpoints / enable breakpoints + n
15.打印表达式的值 : print/p 表达式
16.打印指定变量的值 : p 变量

但是有个缺点,就是只是显示一下,我总不能每次调试都要p一下我想查看的值吧,而且加入我想看100个值,那岂不是要一直p100下,而且每次循环都要p 100,于是又下面这个指令了

17.跟踪显⽰指定变量的值(每次停⽌时) : display 变量名
18.取消对指定编号的变量的跟踪显⽰ :undisplay 编号
19.执⾏到指定⾏号 :until X⾏号
20.从当前位置开始连续执⾏程序 : continue/c

没有其他断点的话直接执行断点后面未执行的所有程序

有断点的话依个执行断点

cgdb扩展功能

1.watch

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者

注意:

• 如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如

果变化了,就会通知你.

• 监视变量的变化

watch监视的result也算一种断点,所以要想删掉这个断点,可以使用d指令

2.条件断点

注意:

• 条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加

• 注意两者的语法有区别,不要写错了。

• 新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30 (条件)

• 给已有断点追加: condition 2 i==30 , 其中 2 是已有断点编号,没有if

• Cgbd 分屏操作 ESC 进⼊代码屏, i 回到 gdb 屏

好啦,今天的博客就到这里啦,下面我们将学习Linux的第一座大山,进程!

加油各位>.<
相关推荐
用户9718356334662 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪4 小时前
linux 拷贝文件或目录到指定的位置
linux
大树8820 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠20 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质20 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush420 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52020 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz20 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工21 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理