启动gdb调试的方式
使用gdb调试有三种方式
一、gdb 可执行二进制文件
gdb executablefilename
二、gdb attach pid(进程ID)
当程序已经在运行,重启程序可能丢失我们所需要的上下文环境,可以用attach的方式,在已经运行的程序上附加gdb调试程序。
被调试程序的进程ID,可以使用以下命令得到:
ps -ef | grep 程序名
gdb attach pid
三、gdb 可执行二进制文件 core文件
程序运行一段时间如果崩溃了,在系统开启生成core文件的前提下,我们可以用gdb调试崩溃时产生的core文件进而定位程序崩溃的原因。
gdb executablefilename corefile.core
gdb常用指令
在用上述方式之一将gdb附加在进程上之后,我们可以采用以下指令进行调试:
启动程序
run,缩写r
(gdb) r
中断程序
Ctrl + C 快捷键让 GDB 中断下来,例如我们使用run之后,想设置一个断点,就可以先用Ctrl + C 中断,然后就会返回gdb的界面
设置断点
break,缩写b
break 函数名,在函数的入口处添加一个断点; break 文件名:行号,在 filename 文件行号为 LineNo 处添加一个断点。 break 行号,在当前文件对应行号添加一个断点;
举例:
(gdb) b test.c:144 // 代表在test.c的144行设置断点
查看已经设置的断点
(gdb) info break
禁用断点
(gdb) disable 断点编号 // 如果不跟 断点编号,代表禁用所有, 断点编号用info break 指令可以得到
禁用后恢复断点
(gdb) enable 断点编号
删除断点
(gdb) delete 断点编号 // 如果不跟断点编号,代表删除所有
设置后触发一次后自动删除的断点
tbreak,用法与break相同
(gdb) tbreak test.c:144 // 代表在test.c的144行设置断点
中断后继续
例如Ctrl+C中断后恢复可以用该指令
continue,缩写c
(gdb) c
查看调用堆栈
查看当前调用堆栈
backtrace 缩写 bt
(gdb) bt
切换到指定堆栈
frame 堆栈编号(编号不加 #),缩写f
(gdb) f 1 // 1 为bt 显示的堆栈编号
查看当前断点处的代码
list 命令(简写为 l)可以查看当前断点处的代码
(gdb)list
(gdb)list + // 往后继续显示代码
(gdb)list - // 往前显示代码
显示变量值
可以先执行
bt
f 堆栈编号
l
再执行
p 变量名
打印函数执行后的结果
p strerror(errno)
修改变量值
p a = 1 // 修改变量a的值为1
打印变量类型
ptype 变量名