gdb调试C/C++程序命令速记…
想要调试程序,在编译程序的时候需要添加-g参数.
g++ test.cpp -g -o test
gdb test #调试程序
gdb test -tui #显示代码窗口
另一种方式:
gdb #启动gdb
file test #用file命令来启动对test的调试
gdb调试没有链接源码
gdb> set directories pathname
方法1:
(gdb)> set args xxx1 xxx2
(gdb)> show args
方法2:
(gdb)> b 22
(gdb)> run xxx1 xxx2
方法3:
root@~# gdb --args xxx1
b <行号> #添加断点,b:breakpoint的简写
b <函数名> #添加断点
b <行号> if 表达式 #添加条件断点(好用)
d <断点编号> #根据编号删除断点,d:delete(不好用啊)
d #删除所有断点,delete也可以(可能会用到)
clear <行号> #删除某行断点(好用)
i b #查看断点
r #run的简写
list #显示代码,如果显示不全再点个回车
list 行号 #显示以该行为中心的一段代码
n #单步执行,不跳入函数,next的简写(vs中F10)
s #真正的单步执行,跳入函数,step(vs中F11)
continue #继续运行程序到下一个断点(vs中F5)
until #跳出当前循环或语句块
until <行号> #继续运行到某一行
finish #跳出函数
display 变量1 #推荐这种,每步都会输出要查看的变量
print <变量或者表达式>
print 地址@数字n #打印从该地址开始的n个变量,例如:
print a[0]@20
watch 变量名 #监视某变量,当变量的值发生变化时就打印该值
set (i=0) #设置i=0
set var key=value #也可以,例如:
set var i=10
print key=value #三种形式,感觉这个是最方便的
call function() #直接调用某函数,手动传值,例如:
call sum(11,20)
调试到某个地方时:
ch #添加当前状态的快照,checkpoint的简写(nb啊)
i ch #查看快照信息
restart 1 #运行1号快照
d c <ID> #删除编号为ID的快照
layout src #显示源码窗口
layout asm #显示反汇编窗口
layout regs #显示源码\反汇编\寄存器窗口
layout split #显示源码和反汇编窗口
core文件相关设置
#查看资源相关限制信息
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文件
#启动gdb调试core
gdb test core.xxx.xxx
#查看堆栈
bt 或 where
#跳转到1号栈帧
f 1
#打开该帧函数的反汇编代码
disassemble
几个常用命令
#打印线程信息
info threads
#查看所有线程的堆栈信息
thread apply all bt
#查看指定线程的堆栈信息
thread apply 5 bt
#进入指定线程栈空间
thread 5
PS:只要没有歧义,大部分命令都可以只输入第一个字母.
q #退出gdb
bt #查看堆栈,backtrace简写
info locals #显示当前函数中的所有变量值
cgdb test #一个可视化调试工具.
(gdb) wi #可视化调试
(gdb) whatis a #查看变量类型
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/