今天我们来讲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 屏

