gdb调试基础知识

641 阅读2分钟

启动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 变量名