目录
一、预备知识
二、常用指令
三、调试技巧
(一)监视变量的变化指令 watch
(二)更改指定变量的值 set var
正文
一、预备知识
程序的发布形式有两种,debug和release模式,Linux gcc/g++出来的二进制程序默认是release模式。
要使用gdb调试,必须在源代码生成二进制程序的时候加上-g 选项,如果没有程序无法编译。

gdb还有个不友好的点是调试时无法直接看到源码,所以使用cgdb调试器。
以下是调试中用到的代码,先创建一个mycmd.c文件将下面代码写入,gcc mycmd.c -o mycmd生成可执行文件然后开启我们的调试之旅

二、常用指令
(1)进入cgdb 调试界面
cgdb 文件名:cgdb mycmd

(2)显示源代码:list/l
list/l: 显示源代码
list/l 函数名: 列出指定函数的源代码 list/l main
list/l 文件名:行号 : 列出指定文件的源代码 list/l mycmd.c:1

(3)退出指令:quit
(4)打断点指令:break/b
break/b 行号: 在指定行设置断点,该行数会有高亮提醒,对应VS调试中的F9操作

(5)查看断点指令: info b/break
info b:查看所有断点信息,前面的1、2...数字表示断点的个数编号,编号根据打断点次数依次递增不受删除断点影响

(6)删除断点指令:delete/d
d 断点编号:删除断点必须通过编号删除,要知道编号得先执行查看获取
删除第2编号断点,再次查看已没编号2

(7)删除所有断点指令:delete/d breakpoints

(8)从程序开始连续执行指令:run/r
第一:gdb启动调试时只是开启了gdb,程序并没有被调试起来必须输入r
第二:run/r表示在gdb场景中启动我们的程序mycmd
第三:在没打任何断点的情况下run/r从头开始执行程序
第四:有断点run/r执行程序时跳到第一个断点处开始执行

(9)逐过程调试指令:n/next
单步执行,不进入函数内部,对应VS调试中的F10

(10)逐语句调试指令:s/step
单步执行,进入函数内部,对应VS调试中的F11

(11)跟踪变量值的指令:display 变量名
在循环过程中想观察变量的数值变化可以使用此语句,display后最前面的数字表示变量编号,对应VS调试中的监视窗口

(12)取消变量值跟踪指令:undisplay 编号
需要通过变量编号删除

(13)执行到指定行号指令:until 目标行号
如果在调试过程中循环语句要执行100次,而你又确定报错一定不在循环中,可以until+目标行号,直接执行完循环到指定行处
(14)运行到下一个断点处指令:continue/c
运行到下一个断点处或直接运行结束
(15)查看当前栈各级函数调用及参数:bt
程序执行到函数时会向栈申请空间,这句代码旨在查看当前执行到这堆栈被调用情况,以下代码只有一个sum函数。
对应VS调试中的堆栈调用监视窗口

(16)查看当前栈帧的局部变量值:info i
也就是当前在debug下的程序信息

(17)禁用所有断点指令:disable breakpoints
为什么禁用断点而不直接删除:调试过程中你可能没有发现问题,并且程序还跑得过去可当你关闭调试,执行代码时程序又报错,如果你直接删除断点无法在之前的调试基础上再次调试,所以禁用断点是为了保留调试痕迹。
没被禁用的断点在查看时Enb下显示y:

disable breakpoints禁用所有断点后Enb下显示n:

(18)启用所有断点指令:enable breakpoints
以上的18点调试技巧足以让我们进行代码调试,有兴趣的同学可以继续了解更多其他调试语句~
三、调试技巧
(一)监视变量的变化指令:watch
在整个程序中你有定义一些静态变量或者一些不应该修改的变量,但你怀疑它修改了导致程序报错,你可以watch它,如果这个变量在运行过程中变了就会通知你


所以断点的类型除了breakpoint 还有watchpoint的形式

(二)更改指定变量的值:set var
指的是在调试中你怀疑导致代码出错的是某个原本不可变变量值,而你此时只是猜测不想直接动源代码改值,可以使用set var更改变量值看是否还报错。

以上是gdb的基础调试语句,看到这希望对你有帮助。