最近使用GDB比较多,发现除了最常用的run、break、continue、next等命令的基本用法外,还有一些非常有用的命令和用法,能让你更加得心应手地使用GDB,在这里做了一下简单的总结。

1. run

当GDB的程序需要带参数运行时,除了使用set args外,还可以直接在run(r)后面带上参数,如下面两种方式是等价的:

2. set follow-fork-mode

有时候会发现GDB无法跟踪到设置的断点,原因可能是需要调试的进程是daemon进程或者fork的子进程,而GDB默认是只会Attach到父进程的。如果要调试子进程,必须在run之前设置follow-fork-mode,执行命令set follow-fork-mode child后在运行程序,就可以一路跟踪fork出的子进程;相对地,如果想停留在当前进程而不再进入子进程,则执行set follow-fork-mode parent即可。

3. print

print可以打印出当前上下文的变量值,print非常强大,除了打印整形等内置变量的值,还可以直接打印出结构体或类对象的值,如:

上图中的结构体有些复杂,打出来的格式不够清晰明了,这时就要使用set print pretty on,设置之后,打印出来的结构体的可读性就好了很多:

在上面的结构体中,buffer数组中的每个字节默认以字符的方式打印,如果是不可打印字符,则输出ASCII码,我们可能想直接打印出实际的二级制值,print可以设置输出数据的格式,如输出为十六进制(x)和十进制(d):

对于数组的输出,p array打印数组的所有元素,p array[i]打印下标为i的元素,如果想打印一段范围的元素,可以使用p array[i]@len,如:

print不仅可以打印变量的值,还可以直接打印函数和类成员方法的返回值,如:

4. finish

在单步调试时,除了next,还可以通过step进入到函数的内部,如果进入到一个很长的函数,而又想跳出该函数,我原来的做法是在调用的函数的下一条语句设置一个断点,其实最简单的方法是使用finish就可以完成当前函数的调用。同样通过finish,我们可以快速定位到调用当前函数的代码。

5. 条件断点

设置断点是我们在使用GDB时最常用的调试手段,有时候我们希望断点在特定的条件下生效,如输入参数满足一定的条件或者循环变量为特定的值,GDB的条件断点就是为此而生的,设置条件断点的方法是break if conditon,如:

break if input>10&&input<20

break if i%100==0

6. 设置变量值

GDB是如此强大,以至于你可以根据调试思路在调试过程中动态地设置变量的值,如改变变量的值以改变程序的执行路径,有两种方式可以设置:

(1)p v=value

(2)set v=value(如果变量名和GDB内置变量冲突,使用set var v=value)

示例如下:

最新文章

  1. linux中Makefile文件相关内容
  2. 简单递推 HDU-2108
  3. jsoup 简介
  4. Swift面向对象基础(中)——Swift中的存储属性和计算属性
  5. java.lang.NoClassDefFoundError: antlr/ANTLRException
  6. operator new3种情况详解
  7. PHP设置图片文件上传大小的具体实现方法
  8. 3月31日学习笔记(CSS基础)
  9. 贪心算法:旅行商问题(TSP)
  10. Java基础知识强化之集合框架笔记36:List练习之键盘录入多个数据在控制台输出最大值
  11. Android之如何混淆代码和相关配置
  12. 关于C语言指针几个容易混淆的概念
  13. app自动化的webView页面测试思路(appium工具)。
  14. oracle 12c 三学习 pdb 可插拔测试
  15. 【转载】C++ STL快速入门
  16. exl表格找两个字符间的数据
  17. The Swap
  18. Android为TV端助力 am命令以及hotkey文件的编写
  19. Looper loop
  20. 多线程,线程同步,synchronized关键字的用法

热门文章

  1. MFC:Tab控件嵌入对话框
  2. C# Thread、ThreadPool、Task、Invoke、BeginInvoke、async、await 汇总
  3. MFC TabCtrl 控件修改标签尺寸
  4. Cordova - IOS浏览器里面数字被当做电话号码
  5. 关于Linux MongoDB的安装
  6. phpMyAdmin 4.7.x CSRF 漏洞利用
  7. [Swift]LaunchScreen.storyboard设置启动页
  8. Spring Boot Starters启动器
  9. Spring 声明事务中transactionAttributes属性 + - Exception 实现逻辑
  10. Android SD卡读写