1. 简介
GDB全称GNU symbolic debugger,是GNU开源组织发布的一个强大的Linux下的程序调试工具,GDB主要帮助你完成下面四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的调置的断点处停住(断点可以是条件表达式)。
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
2. 常用命令介绍
r或run:运行一个待调试的程序
c或contine:让暂停的程序继续运行
n或next:运行到下一行
s或step:单步执行,遇到函数会进入
u或until:运行到指定行
fi或finish:结束当前调用的函数,回到上一层函数调用处
return:结束当前调用函数并返回指定值,到上一层函数调用处
j或jump:将当前程序执行流跳转到指定行
- jump LineNum:跳转到代码的LineNum行的位置
- jump *address:跳转到address地址的代码处,地址前面要加*
备注:1.跳过的代码不会被执行;2.跳到的位置如果没有断点那么GDB会继续往下执行
p或print:打印变量或寄存器的值
- print param:用于在调试过程中查看变量的值
- print param = value:用于在调试过程中修改变量的值为value
- print a+b+c:可以进行一定的表达式运算
- print func():输出func函数的执行结果,常见用途是打印系统函数执行失败的原因:print strerror(errno)
- print *this:在C++对象中,可以输出当前对象的各成员变量的值
print不同类型的值
- p/x:十六进制显示
- p/d:十进制显示
- p/u:无符号十进制显示
- p/o:八进制显示
- p/t:二进制显示
- p/a:地址格式显示
- p/c:字符串格式显示
- p/f:浮点数格式显示
- p/s:字符串格式显示
bt或backtrace:查看当前线程的栈调用
f或frame:切换到当前调用线程的指定堆栈
thread:切换到指定线程
b或break:添加断点
- break FuncName,在函数的入口添加断点
- break LineNum,在当前文件行号为LineNum的代码处添加断点
- break FileName:LineNum,在FileName文件的第LineNum行处添加断点
- break FileName:FuncName,在FileName文件的FuncName函数入口处添加断点
- break -/+offset,在当前程序暂停位置的前/后offset行除添加断点
- break … if cond, 添加条件断点
tb或tbreak:添加临时断点(第一次执行到后会自动清除,使用方法同break)
d或delete:删除断点
enable:启用某个断点
disable:禁用某个断点
i或info:查看断点或线程信息
i/info b,显示当前所有断点的信息
watch:监视某一个变量或内存地址的值是否发生变化
l或list:显示源码
- list -,显示上一次list命令显示的代码前面的代码
- list LineNum,显示当前代码文件第LineNum行附近的代码
- list FileName:LineNum,显示FileName文件第LineNum行附近的代码
- list FuncName,显示当前文件FuncName函数附近的代码
- list FileName:FuncName,显示FileName文件的Fun从Name函数附近的代码
- list LineNum1,LineNum2,显示LineNum1到LineNum2之间的代码
备注:list默认只会输出10行源代码,可以通过show listsize确认list命令显示的代码行数,set listsize count设置list命令显示的的代码行数为conut
ptype:查看变量类型
dis或disassemble:查看汇编代码
set args:设置程序启动命令行参数
show args:查看设置的命令行参数
3. GDB的调试方式
- 直接调试目标程序
- 附加进程id
- 调试core文件
4. GDB的退出
可以输入命令q或quit退出,或者Ctrl+d退出
如果GDB attach某个进程,退出GDB之前要用命令detach解除附加进程