使用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
8
方法1:
(gdb)> set args xxx1 xxx2
(gdb)> show args
方法2:
(gdb)> b 22
(gdb)> run xxx1 xxx2
方法3:
root@~# gdb --args xxx1

断点管理

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
5
display 变量1   #推荐这种,每步都会输出要查看的变量
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 #显示源码和反汇编窗口

调试coredump

core文件相关设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#查看资源相关限制信息
ulimit -a

#设置core文件大小为无限大,设置0则不会产生core文件
ulimit -c unlimited

#查看core文件存储位置
cat /proc/sys/kernel/core_pattern

#修改core文件位置
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern
/data/coredump是自己指定的存放coredump文件的路径
%e表示程序的文件名
%E:程序文件的完整路径
%p表示进程的ID
%t:进程奔溃的时间戳
%s:哪个信号让进程奔溃

#永久设置core文件大小和存储位置
vim /etc/profile
ulimit -c unlimited
echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern

gdb调试core文件

1
2
3
4
5
6
7
8
9
10
11
#启动gdb调试core
gdb test core.xxx.xxx

#查看堆栈
bt 或 where

#跳转到1号栈帧
f 1

#打开该帧函数的反汇编代码
disassemble

调试多线程

几个常用命令

1
2
3
4
5
6
7
8
9
10
11
#打印线程信息
info threads

#查看所有线程的堆栈信息
thread apply all bt

#查看指定线程的堆栈信息
thread apply 5 bt

#进入指定线程栈空间
thread 5


1
2



1
2


其他

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/