添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
gdb 常用命令

gdb 常用命令

信息查看

查看栈信息:

  • (gdb) bt :显示所有栈帧
  • (gdb) bt 10 :显示前面10个栈帧
  • (gdb) bt -10 :显示后面10个栈帧
  • (gdb) bt full :显示栈帧以及局部变量
  • (gdb) bt full 10 :显示前面10个栈帧以及局部变量
  • (gdb) bt full -10 :显示后面10个栈帧以及局部变量
  • (gdb) frame <栈帧编号> :进入指定的栈帧中,然后可以查看当前栈帧中的局部变量,以及栈帧内容等信息
  • (gdb) info frame <栈帧编号> :可以查看指定栈帧的详细信息
  • (gdb) up :进入上层栈帧
  • (gdb) down :进入下层栈帧

变量

查看变量信息:

  • (gdb) p <变量名>

寄存器

对于调试来说寄存器中的值也很重要,可以查看到当前正在执行的指令的地址等。具体操作如下:

  • (gdb) info reg :显示所有寄存器。可以简写为: i r 。如果要查看具体的寄存器可以这样: i $ebx
  • (gdb) p $eax :显示eax寄存器内容
  • (gdb) p/c $eax :用字符显示 eax 寄存器内容

反斜杠后面的是显示格式,可使用的格式见下表:该表在显示内存内容的 x 命令中也是通用的

格式 说明
x 显示为十六进制数
d 显示为十进制数
u 显示为无符号十六进制数
o 显示为八进制数
t 显示为二进制数
a 显示为地址
c 显示为字符(ASCII)
f 显示为浮点数
s 显示为字符串
i 显示为汇编代码(仅在显示内存的x命令中可用)

内存

可以查看具体内存地址中的内容,比如:目前执行的汇编指令,以及栈中的内容等。

  • (gdb) x $pc :显示程序指针指向位置的内容
  • (gdb) x/i $pc :显示程序当前位置的汇编指令
  • (gdb) x/10i $pc :显示程序当前位置开始往后的10条汇编指令

断点调试

调试程序中,设置断点进行调试是最方便有效的手段,因此学会如果灵活设置断点是调试的基本功。

设置断点

  • (gdb) break <函数名> :对当前正在执行的文件中的指定函数设置断点。可简写为:(gdb) b <函数名>
  • (gdb) break <行号> :对当前正在执行的文件中的特定行设置断点。可简写为:(gdb) b <行号>
  • (gdb) break <文件名:行号> :对指定文件的指定行设置断点。最常用的设置断点方式。可简写为:(gdb) b <文件名:行号>
  • (gdb) break <文件名:函数名> :对指定文件的指定函数设置断点。C++类中的方法似乎不好使。可简写为:(gdb) b <文件名:函数名>
  • (gdb) break <+/-偏移量> :当前指令行+/-偏移量出设置断点。可简写为:b <+/-偏移量>
  • (gdb) break <*地址> :指定地址处设置断点。可简写为:b <*地址>

查看、删除断点

  • (gdb) info break :显示所有断点以及监视点。可简写为:(gdb) i b
  • (gdb) delete <编号> :删除编号指向的断电或者监视点。可简写为:(gdb) d <编号>
  • (gdb) clear <行号> :删除该行的断点
  • (gdb) clear <文件号:行号> :删除该行的断点

设置无效、有效断点

  • (gdb) disble <断电编号> :当前断点设置为无效
  • (gdb) enable :当前断点设置为有效

监视点

可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。删除,查看监视点的方式与断点相同。设置监视点方式如下:

  • (gdb) watch <表达式> :表达式发生变化时暂停
  • (gdb) awatch <表达式> :表达式访问或者改变时暂停
  • (gdb) rwatch <表达式> :表达式被访问时暂停

条件断点

在调试程序过程中,有时候我们只想在某个条件下停止程序,然后进行单步调试,而条件断点就是为此而设计。下面是条件断点的操作方式:

  • (gdb) b <断点> if <条件表达式> : 例如:b main.cpp:8 if x=10 && y=10
  • (gdb) condition <断点编号> :删除该断点的条件。
  • (gdb) condition <断点编号> <条件表达式> :修改断点条件。例如:condition 1 x=10 && y=10

断点命令

每次断点发生时候,想要查看的变量很多时,如果每个变量都手动 print 需要浪费很多时间。断点命令可以在断点发生时批量执行GDB命令。下面是断点命令的设置方式:

  • (gdb) commands <断点编号>
  • (gdb) >print x
  • (gdb) >print y
  • (gdb) >end
    首先输入 GDB 命令 commands <断点编号> 然后回车,这时候会出现> 提示符。出现> 提示符后可以输入断点发生时需要执行的GDB命令,每行一条,全部输入完成后输入end结束断点命令。

反复执行

单步执行时如果进入了你不关心的函数,你想立即跳出函数;或者进入了大循环中,你想立即循环。下面的命令可以帮到你:

  • (gdb) ignore <断点编号> <次数> :忽略N次断点
  • (gdb) c N : 执行N次指令,会忽略断点
  • (gdb) s/stepi/n/nexti N :往后执行N行,不会忽略断点
  • (gdb) finish :执行完当前函数后停止,不会忽略断点
  • (gdb) until :执行完当前循环后停止,不会忽略断点
  • (gdb) until <地址> :执行到指定地址停止

设置变量值

对变量的值进行控制,可以更快的调试自己的程序。下面就是设置变量值的方法:

  • (gdb) set variable <变量> = <表达式> :将变量的值设定为指定表达式的值。例如 set variable x=10

编辑于 2022-04-01 16:20