gdb 命令_gdb实用的调试技巧:启动方式、堆栈信息、单步调试

本文介绍了gdb在Linux环境下的调试技巧,包括三种启动gdb的方式:gdb+进程名、gdb-symbols-exec及gdb-p进程号。在程序崩溃时,使用bt命令查看堆栈信息,或用threadapplyallbt查看所有线程堆栈。此外,还分享了两种调试技巧:一是利用watch跟踪变量变化,二是通过next和step进行单步调试,辅助开发者高效定位问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于很多开发者来说,开发过程中难免会遇到各种各样的bug, 所以,每个开发者应该考虑如何快速高效定位问题原因,而gdb是linux上很实用的调试工具,熟练掌握其调试技巧,将有助于提高解决问题的效率,也是开发者应该掌握的基本技能。

本文首先会讲解三种启动gdb的方式,然后再介绍两种查看堆栈信息的方法,最后再详细说明两种单步调试的实用技巧。

20bf0a968730b2e8ede50f8e4f4b8518.png

三种启动

通过gdb启动程序,通常有三种方式。下面分别进行讲解说明。

第一种方式是: gdb + 进程名。 编译程序的时候,需要加上-g选项,以便可执行程序中加入符号表信息,方便问题定位。

59c9ed02e1c6ac40cbf2fe4c5465237f.png

第二种方式,gdb –symbols=有符号表的进程 –exec=没有符号表的进程。首先创建没有符号表的进程,然后创建带有符号表的进程,最后再启动进程。

9a63dbb2a83502eb101623ef551ba4cd.png

第三种方式,gdb -p 进程号。 这个方式也是最多使用的。因为进程崩溃的时候,仍然可以使用该方式,附着gdb到进程中,然后查看堆栈信息。

首先以后台运行的方式启动进程,然后查看进程的进程号,最后执行“gdb -p 进程号”的命令,把gdb附着到进程中,这样就可以很方便进行调试。

36da70d71487427fe7a90a7dc7fff788.png

两种堆栈

当程序突然崩溃的时候,可以使用gdb附着到程序中,然后执行bt命令来查看最新的堆栈信息,这往往能够很快定位到问题的原因。

5e3d69dd1164e978287ddffff8902c80.png

如果进程中启动很多线程,那么如何查看每个线程的堆栈信息呢,执行命令thread apply all bt,可以查看当前进程的所有线程的堆栈信息。

2d628982b996d328d84eaafd0b11e499.png

两种技巧

第一个技巧就是利用watch来观察某个变量的变化,当watch检测的变量发生变化的时候,gdb就会立即中断。

假设想要检测Fun函数下i_sum的变化情况,那么首先在该处设置断点,然后运行程序。

450c82ee2ef71232e32980b78136a8d9.png

运行到断点位置的时候,程序停止,那么可以使用p命令打印变量的值,还可以查看变量的地址,最后还可以使用该地址来设置watch的观察点。

e7cc53b3d8a6fddf1a4ac4e4cb7e9775.png

第二个技巧就是单步调试,它的好处就是让开发者可以轻松跟踪代码的流程,从而不需要通过添加日志的方式来确定代码的流程。

假设有如下所示的代码段,我们通过单步调试的方式来跟踪代码流程。首先,通过gdb启动程序,或者程序附着上gdb之后,设置断点,然后从断点处开始跟踪代码流程。

11a6c02154f3ecd1eb736c9454424e1d.png

通过命令r启动程序,程序停止在断点处之后,使用n命令(next)进行单步运行,注意该命令不会进入函数内部跟踪。

7c47af8155d06543ac933d6e5d24f4c5.png

那么如果想要进入函数,怎么办呢,可以使用s命令(step)来进入函数内部进行单步调试。

7bff21f4690eb14e9148c0615d5d4cf6.png

如果函数内部太长,不想要跟踪,那么可以输入命令finish, 直接跳出函数,注意该命令会执行完成函数之后,再退出。

124c2753a97067ab8deb9729014ab238.png

而跳出函数,还有另一个命令return, 但是它不会执行完成函数再退出,而是直接退出。

73655e915394c117bde941f0be3fc4b1.png

最后补充一个查看局部变量的命令: info locals 。在断点位置的时候,使用该命令查看局部变量,有助于提高定位问题的效率。

总结

本文梳理了gdb的常用调试技巧,分别从三个方面进行说明,分别为三种启动、两种堆栈以及两种技巧。启动方式比较常用的是采用-p选项,将gdb附着到程序中。查看堆栈信息的命令bt适用于程序崩溃的问题,thread apply all bt命令则可以查看所有线程的堆栈信息。watch命令跟踪变量的变化情况。next则执行单步运行,但是不进入函数内部,step则会进入函数内部; 命令finish可以跳出函数,但是它会执行完成函数之后再退出;而命令return, 则不会执行完成函数,而是马上就退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值