gdb调试教程
- 前言
- gdb的调试命令
- 显示需要调试的代码:`l`( list )
- 启动调试:`r` (run)
- 断点:`b`(Breakpoint)
- 设置断点
- 查看断点:info b
- 删除断点:d
- 打开断点 / 关闭断点
- 逐语句进行调试:n(next)
- 逐过程进行调试:s(step)
- 长显示变量值:display(内置类型、结构体和自定义类型)
- 取消长显示变量:undisplay
- 跳过某个区间代码的调试:until
- 跳转断点操作:c
- 直接执行当前函数功能:finish
- 退出 gdb 调试:q(quit)
前言
在Linux中,使用 gcc / g++ 默认形成的可执行程序都是release
版本,而release
版本是不能进行调试的。
因此在使用gdb调试程序时,我们要用到debug版本。gcc/g++ 形成debug版本的可执行程序如下:
在编译源文件时我们只需要带上-g
选项即可,下面以test.c
源文件为例子
gcc -o test-debug test.c -g
gdb的调试命令
以上面生成的test-debug
可执行文件为例子,首先要进入调试模式:
gdb test-debug
如果显示以下情况,说明没有安装gbd
在终端输入以下命令即可安装gdb:
sudo yum -y install gdb
显示需要调试的代码:l
( list )
在gdb调试下直接输入l
命令会随机定位代码,想要定位到最开始的代码位置直接输入:
l 0
又或者:
l 1
提示:l 1
之间是存在空格的
当然也是可以直接定位显示到main函数所在的代码位置,命令如下:
l main
输入完对应要求指令后,后续一直输入回车,可以将调试代码按当前行号最后一行代码依次往后都显示到终端上。
启动调试:r
(run)
在gdb下直接输入:
r
gdb下的r
命令就好比VS下的F5快捷键,在没有断点或是输入的情况下会将程序运行起来并且直接跑完,遇到断点或是需要输入时才会停下来。因此r
命令要和断点配合使用
断点:b
(Breakpoint)
设置断点
- 在
b
命令后加上需要打上断点的行号( b 和行号之间需要空格)
b 100 //在100行代码处打断点
- 也可以在b命令后+文件名称+
:
+行号 (b 和文件名之间存在空格)
b test.c:100
- 在文件中找打对应函数打断点: 在
b
命令后 + 当前文件名字 +:
+ 函数名 (b 和文件名之间存在空格)
b test.c:main
提示:在文件中打对应函数断点会默认出现在函数内部代码的第一行,并不会出现在函数名行
查看断点:info b
info b
例如,在 test.c 源文件内容如下:
gdb下执行以下操作:
查看断点时会将所有的断点信息都显示出来,从哪行开始打的断点,该断点的编号就是第一个。
删除断点:d
- 删除断点:输入
d
命令后面需要加上该断点的编号
如将上面的第六行代码的断点删除操作如下:
d 1 //删除编号为1的断点
- 删除所有断点:
d breakpoints //删除所有断点
打开断点 / 关闭断点
- 打开断点:
enable breakpoint + 断点编号
enable breakpoint 5 //将编号为5的断点进行打开
- 关闭断点:
disable breakpoint + 断点编号
disable breakpoint 5 //对编号为5的断点失能
在进行调试时,关闭当前断点后,不会在这个断点处进行停留,称为当前断点为失能断点。
逐语句进行调试:n(next)
- 逐语句调试是指:当程序遇到函数调用时,调试器会执行整个函数,然后跳到函数返回后的下一条语句,而不进入函数内部。
n
这里输入的n
指令就好比 Visual Studio 中的 F10 快捷键
逐过程进行调试:s(step)
- 逐过程调试是指:当程序执行到包含函数调用的语句时,逐过程调试会进入函数内部,并逐行执行函数内的代码(在这里输入指令时,不管是不是库函数都会进入到函数内部)
s
这里输入的 s
指令就好比 Visual Studio 中的 F11 快捷键
长显示变量值:display(内置类型、结构体和自定义类型)
- 在逐过程或是逐语句调试代码时,显示对应想要知道的变量值。
display 变量名称
设置了长显示变量后, 最前面会带有编号。这个编号是用于后续取消调用变量的显示作用
设置了长显示变量后,每次输入指令 n
或者s
后,先显示执行代码随后都会显示变量值。
取消长显示变量:undisplay
- 取消每次调试时所显示的变量值
undisplay 变量名编号
跳过某个区间代码的调试:until
- 在函数内,进行指定位置跳转,直接执行完区间代码(until 与 行号之间存在空格)
until 行号 //从当前行代码跳转到对应行号代码上
例如下面简单循环代码,要执行20次重复操作,逐过程或是逐语句都没办法,一直输入n / s 指令难免会烦躁
此时使用 until
命令跳出循环,直接到15行代码即可:
跳转断点操作:c
- 从当前断点直接运行到下一个断点处,直接输入指令c
c
此操作好比Visual Studio中当前断点按下快捷键F5后到下一个断点处
直接执行当前函数功能:finish
- 执行当前函数功能,返回到调用该函数对应行号,不对该函数返回值进行赋值操作
finish
finish
指令会直接完成当前函数功能,然后退回到调用该函数的行号处停下来。
来看以下例子:
在这里我们先进入Sum函数中
![在这里插
输入指令finish
后,可以发现执行的代码会直接跳转到12行处,但是 sum1 变量没有被赋值。
退出 gdb 调试:q(quit)
调试完代码后之间输入q
命令即可退出 gdb 模式。
当然在调试过程中如果输入q
命令会弹出是否退出调试的提示,此时再输入 y
即可。
gdb基本调试技巧就讲到这里,感谢大家的支持!!!