1. GDB基本操作
(1) 开启GDB调试
-
调试可执行文件program,一般直接在需要调试的文件目录下执行。注意,待调试的文件需要使用-g参数编译才能使用GDB调试。
$gdb program
gdb gateway
-
常用操作
r(run) 开始调试,会自动跳到第一个断点,若没有断点,直到执行完代码或错误停止。
l(list) 查看当前执行代码上下文,方便调试过程中查看代码。
n(next) 单步调试,执行下一句代码,若下一句代码为函数调用,不进入函数内部执行。
s(step) 进入函数内部调试。
c(continue) 继续执行,直到下一个断点或错误停止。
p(print) x 打印出x的当前值。
until l 直接运行至指定行数l。
f(finish) 运行程序直到程序结束。
q(quit) 退出gdb。
-
断点相关操作
info break 查看当前所有断点的信息。
b(break) 13 在第13行设置一个断点。
b main 在main函数入口处设置一个断点。
break server.cpp:25 在当前文件夹下其他文件server.cpp中的第25行设置断点。
break sdk/net/ws.cpp:28 在当前项目其他文件ws.cpp中的第28行设置断点。
delete 5删除编号为5的断点。
disable/enable 25 禁用/启用编号为25的断点。
break 15(where) if i3(condition) 假设第15行代码为for(int i = 0; i < 10; ++i),当执行该语句且i3时,此处断点生效。
在实际项目中,需要多次调试同一个文件,因此保留每次调试的断点设置是很有必要的,gdb中也提供这样的功能,能够方便的存储和读取断点。
- 保存断点
先用info b 查看一下目前设置的断点,使用save breakpoint命令保存到指定的文件,这里以进程名字+bp后缀为文件名,输入命令
save breakpoint gateway.bp
- 读取断点
注意,在gdb已经加载进程的过程中,是不能够读取断点文件的,必须在gdb加载文件的命令中指定断点文件,具体操作是使用-x参数。例如,我需要调试gateway_server这个文件,同时使用上次存储的断点文件gateway.bp。输入命令
gdb gateway_server -x gateway.bp
- 多线程调试
info thread 查看当前进程的线程。
thread 切换调试的线程为指定ID的线程。
(2) GDB查看core文件,定位问题代码
core是程序非法执行后core dump后产生的文件。测试源代码如下图