使用gdb调试程序

gdb调试C/C++程序命令速记…

运行gdb

想要调试程序,在编译程序的时候需要添加-g参数.

1
2
3
g++ test.cpp -g -o test
gdb test #调试程序
gdb test -tui #显示代码窗口

另一种方式:

1
2
gdb #启动gdb
file test #用file命令来启动对test的调试

断点管理

1
2
3
4
5
6
7
b <行号>	#添加断点,b:breakpoint的简写
b <函数名> #添加断点
b <行号> if 表达式 #添加条件断点(好用)
d <断点编号> #根据编号删除断点,d:delete(不好用啊)
d #删除所有断点,delete也可以(可能会用到)
clear <行号> #删除某行断点(好用)
i b #查看断点

运行程序

1
2
3
r	#run的简写
list #显示代码,如果显示不全再点个回车
list 行号 #显示以该行为中心的一段代码

控制调试进程

1
2
3
4
5
6
n	#单步执行,不跳入函数,next的简写(vs中F10)
s #真正的单步执行,跳入函数,step(vs中F11)
continue #继续运行程序到下一个断点(vs中F5)
until #跳出当前循环或语句块
until <行号> #继续运行到某一行
finish #跳出函数

打印\监视变量

1
2
3
4
print <变量或者表达式>
print 地址@数字n #打印从该地址开始的n个变量,例如:
print a[0]@20
watch 变量名 #监视某变量,当变量的值发生变化时就打印该值

nb功能

1
2
3
4
5
6
set (i=0)	#设置i=0
set var key=value #也可以,例如:
set var i=10
print key=value #三种形式,感觉这个是最方便的
call function() #直接调用某函数,手动传值,例如:
call sum(11,20)

快照管理

调试到某个地方时:

1
2
3
4
ch	#添加当前状态的快照,checkpoint的简写(nb啊)
i ch #查看快照信息
restart 1 #运行1号快照
d c <ID> #删除编号为ID的快照

窗口设置

1
2
3
4
layout src	#显示源码窗口
layout asm #显示反汇编窗口
layout regs #显示源码\反汇编\寄存器窗口
layout split #显示源码和反汇编窗口

其他

多线程调试,内核转储什么的等遇到再整理…
PS:只要没有歧义,大部分命令都可以只输入第一个字母.

1
2
3
4
5
6
q		#退出gdb
bt #查看堆栈,backtrace简写
info locals #显示当前函数中的所有变量值
cgdb test #一个可视化调试工具.
(gdb) wi #可视化调试
(gdb) whatis a #查看变量类型

  • 调试时重定向 run < test.txt

问题记录

1.No frame is currently executing in specified block Command aborted.
问题原因:使用watch监视变量tmp,但是程序运行到tmp未定义的地方了.
解决方法:info watch查看变量tmp的编号,delete <编号> 就可以了.

参考

https://www.xuebuyuan.com/1855384.html
https://www.cnblogs.com/TianFang/archive/2013/01/20/2868889.html
https://www.cnblogs.com/rosesmall/archive/2012/04/13/2445527.html
https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
https://www.jianshu.com/p/08de5cef2de9

欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/