gdb调试技巧

前言

在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基本调试技巧就讲到这里,感谢大家的支持!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值