GDB是GNU组织在Linux系统中发布的程序调试器,它功能强大,使用方便,已经成为Linux系统中C/C++程序调试必备的工具。
GDB命令
一般来说,GDB能完成一下几个方面的工作。
- 调试程序:支持代码级别的调试,可以一行一行地执行程序。
- 动态断点设置:可以动态设置断点,甚至设置条件表达式,并自定义程序停止或运行。
- 检查运行状态:提供丰富的检查机制,能够查看变量、内存等资源的使用。
- 执行环境动态改变:支持动态改变程序的执行环境。
启动
- 一种是在启动的时候输入
gdb filename
,其中filename
是可执行文件名,可以自动加载被调试的文件; - 其次是在启动gdb之后,输入
file filename
,其中file
是gdb内置的命令,用于指明要加载的调试文件。 - 在启动的时候如果加上
-q
参数,则不显示gdb的版权logo等信息
退出
退出gdb的命令是quit
,输入quit后即可完全退出gdb,有时候可能需要值终止被调试的可执行程序,这时候可以输入kill
命令,kill的意义是终止当前正在调试的程序。
分类
gdb命令可以分为5类:
- 运行环境设置与查看
- 断点设置与恢复
- 源码查看
- 程序数据查看
- 运行参数设置
运行环境设置与查看
运行环境设置与查看包括在gdb中设置环境变量、查看环境变量、设置程序运行的路径、查看已设的路径、设置工作目录、查看工作目录、Shell命令等。
参数名 | 意义 |
---|---|
set environment var [=value] | 设置环境变量,其中var是环境名,value为变量的值 |
show environment [var] | 查看环境变量 |
path dirpath | 设置程序的运行路径 |
show path | 查看程序运行路径 |
cd dir | 设置工作目录,其中dir为工作目录名 |
pwd | 查看工作目录 |
shell command | 支持shell命令,其中command为命令名 |
断点设置与恢复
断点设置与恢复是程序调试中最频繁的操作,gdb提供类丰富的断点设置与恢复调试命令。
参数名 | 意义 |
---|---|
break [断点名] | 设置断点,断电名可以是行号、函数名,甚至是条件表达式 |
tbreak [断点名] | 与break类似,不同的地方在于断点执行过后辉自动取消该断点 |
step | 单步运行,若有函数调用,会进入函数内部 |
next | 单步运行,若有函数调用,不会进入函数内部 |
continue | 继续运行,直到下一个断点或程序结束 |
finish | 运行程序,直至当前函数完成,并打印函数返回时的堆栈地址、返回值及参数值等信息 |
delete [断点名] | 删除指定断点 |
disable [断点名] | 停止指定的断点 |
enable [断点名] | 恢复指定被disable停止的断点 |
clear | 清楚所有断点,若delete不适用参数,可达到同样的效果 |
bnfor [断点名] | 查看所设的断点 |
ignore [断点名][n] | 对指定的断点忽略n次,n为常数 |
condition [断点名]<表达式> | 为指定的断点修改条件表达式 |
源码查看
为方便程序的调试,用户可以调用源码查看命令,随时查看指定位置的源码。
参数名 | 意义 |
---|---|
list [var] | 列出当前源码,var可以是行号,也可以是函数名 |
info line | 查看gdb中加载到内存中的源码 |
forware-search | 正则表达式,从当前位置向前搜索满足条件的源代码 |
reverse-search | 正则表达式,从当前位置向后搜索满足条件的源代码 |
程序数据查看
程序数据查看是在调试程序时,查看相关变量或表达式的值。
参数名 | 意义 |
---|---|
print [var] | 输出表达式或者变量的值 |
x [n/f/u] | 输出内存变量的数据,其中n为长度,f为格式,u为从当前位置向后的长度 |
watch [var] | 为变量var设置观察点,若变量值有变化,则停止程序 |
rwatch [var] | 为变量var设置观察点,若变量值被读取时,停止程序 |
awatch [var] | 为变量设置观察点,当变量的值被修改时,停止程序 |
info watchpoint | 显示所有的观察点 |
display [var] | 显示表达式或变量的值 |
运行参数设置
运行参数设置是指在程序运行时,设置相应变量的值,它的基本设置命令是set。
参数名 | 意义 |
---|---|
set args | 制定程序运行时的参数以及值 |
show args | 显示运行参数值 |
set var = value | 为程序中制定的变量设置值 |
disasseble
/m 源码和汇编一起排列
/r 查看16进制
用x/i查看
x/15i main
$pc 指向当前程序运行地址
x/5i $pc
disasseble $pc
display/i $pc
x/i $pc
查看寄存器的植
p $rax
help layout
在gdb中,运行程序使用r或者run命令
程序运行参数
set args 可指定运行时参数
show args 查看设置好的运行参数
info terminal 显示你程序用到的终端的模式
调试已运行的程序
gdb PID <进程id>
或者先关联源码,在gdb中用attach <进程id>。并用detach来取消挂载的进程
调试程序中,暂停程序时是必须的,GDB可以方便地暂停程序的运行。你可以设置程序
在哪停住以便查看运行时的变量,以及运行时的流程。
当进程被gdb暂停时,可以使用info program来查看程序是否在运行,进程号以及被暂停的原因
在gdb中,可以有以下几种暂停方式:
断点(BreakPoint),观察点(WatchPoint),捕捉点(CatchPoint),信号(Signals),线程停止(Thread Stops)
如果要恢复程序运行,可以使用c或者continue命令。
使用“disable 断点号”命令可以使某个断点失效,程序运行到该点不会停下而是继续运行,使用“enable 断点号”命令可以让某个断点恢复有效。
gdb -q <程序名> # -q参数去除版权信息
查看内存数据
x/<n/f/u> <addr> # n f u是可选参数
n
n 是一个正整数,表示需要读取的内存单元的个数,也就是说从当前地址向后显示内存单元的内容,一个内存单元的大小由后面的u定义
f
f 表示显示的格式
x 十六进制格式
d 十进制格式
u 无符号十进制格式
o 八进制格式
t 二进制格式
c 字符格式
f 浮点数格式
u
u表示从当前地址往后请求的字节数,如果不指定的话,gdb默认是4个字节
b 表示单字节
h 表示双字节
w 表示四字节
g 表示八字结
当我们指定了单位长度后,gdb会从指定的内存地址开始,读写n个单元
单步执行
s是step,n是next,step会进入函数,next会跳过函数
si,ni是汇编级别的调试
s,n是c语言级别的调试
断点
查看所有的断点
i b
删除断点
delete # 删除所有断点
delete <num> # 指定断点删除
Intel汇编格式显示
set disassemebly-flavor intel
disassemble /r
汇编以及16进制数据一起显示
disassemble /m
连同源码一起显示
$pc # 执行当前程序的运行地址, 也就是eip的值
p $pc
查看源码
show listsize
set listsize count 设置list命令显示的源代码数量最多为count行,0表示不限制行数
show listsize 显示listsize的值
set disassembyl-flavor intel 默认值是att
set disassemble-next-line on/off/auto 当程序停下来的时候,是否显示下一行源代码的汇编代码,默认为off
show disassemble-next-line 显示disassemble-next-line的值
显示指定位置的源代码
可以是行号,函数名,地址
list linenum
list function
list *addr
list 3, 7
where/bt 查看运行的堆栈列表
bt backtrace 显示当前调用堆栈
show args 查看设置好的参数
info program 查看程序状态,是否在运行等等
next 执行下一步(如果遇到函数不会进入函数)
next n 执行n次下一步
step 单步执行下一步
finish 执行完当前函数返回到调用它的函数
return 立即结束当前函数的运行,即跳过接下来的语句,可带参数,即指定任意返回值
until 执行完当前循环体
info registers 查看当前寄存器的值
info program
whatis <var>
info locals
print
display
参考:https://www.jianshu.com/p/c3e5f5972b21
更多参考:https://blog.csdn.net/niyaozuozuihao/article/details/91802994
https://www.gnu.org/software/gdb/documentation/