1.前言
GDB是Linux下非常好用且强大的调试工具。GDB可以调试C、C++、Go、java、 objective-c、PHP等语言。对于一名Linux下工作的c/c++程序员,GDB是必不可少的工具
2.GDB使用帮助
GDB命令拥有较多内部命令。在gdb命令提示符
下输入help
可以查看所有内部命令及使用说明
3.使用GDB前注意文件是否带有调试信息
判断文件是否带有调试信息:要调试C/C++的程序,首先在编译时,要使用gdb
调试程序,在使用gcc
编译源代码时必须加上-g
参数。保留调试信息,否则不能使用GDB进行调试。
当你有一个编译好的二进制文件,你不确定是否带有调试信息,这个时候你可以使用如下的命令验证:
gdb 二进制文件名
如果没有调试信息,则会出现该二进制文件地址(提示无调试信息):
Reading symbols from /home/ordinary/code/c++/test...(no debugging symbols found)...done.
如果有调试信息,则会出现二进制文件地址:
Reading symbols from /home/ordinary/code/c/test...done.
4.使用GDB
启动gdbgdb <program>
:启动gdb,并加载指定的可执行文件<program>gdb <program> <core>
:启动gdb,并加载指定的可执行文件<program>和核心转储文件<core>,用于分析程序崩溃时的状态gdb <program> <pid>
:启动gdb,并加载指定的可执行文件<program>和进程号为<pid>的正在运行的进程,用于动态调试
退出gdb
quit或q
设置断点break <location> 或 b <location>
:在指定的位置设置一个断点,可以是函数名、文件名:行号、或者内存地址。例如:
break main:在main函数的开始处设置断点break test.c:10:在test.c文件的第10行设置断点break *0x80483f4:在地址0x80483f4处设置断点
删除指定编号的断点
delete <number> 或 d <number>
查看断点编号
info break或i b
禁用断点
disable <number>
启用断点
enable <number>
list <行号或者函数名> 或 l <行号或者函数名>
调试阶段查看代码
run <arguments> 或 r <arguments>
运行或重新运行程序,并传递指定的参数。如果设置了断点,程序会在遇到断点时暂停,并显示当前的源代码和寄存器值。
next或n
F10执行当前行,并跳到下一行。如果当前行是一个函数调用,next会直接执行整个函数,并不进入函数内部
step或s
F11执行当前行,并跳到下一行。如果当前行是一个函数调用,step会进入函数内部,并停在第一行
continue或c
继续执行程序,直到遇到下一个断点或者程序结束
finish或f
运行所在函数后停下来
until
跳转至指定行
print <expression> 或 p <expression>
打印某个变量或者表达式的值。可以使用任何合法的C语言表达式,包括宏、指针、结构体等
例如:
print x打印变量x的值print *p:打印指针p所指向的值。print foo(x):打印调用foo函数并传递x作为参数后的返回值。
常显示某个变量的地址或者值
display
取消常显示某个变量的地址或者值
undisplay <number>
修改某个变量或者表达式的值。可以使用任何合法的C语言表达式,包括宏、指针、结构体等
set <expression>
例如:
set x = 10:修改变量x的值为10。set *p = 20:修改指针p所指向的值为20。set foo(x) = 30:修改调用foo函数并传递x作为参数后的返回值为30。info registers或i r:显示所有寄存器的值。