GDB 使用指北

记得加上 -g

常用命令(转自 OI wiki):

  • listl):列出程序源代码,如 l main 指定列出 main 函数附近的若干行代码。
  • breakb):设置断点,如 b main 表示在 main 函数处设置断点。
  • if <CONDITION>:如果满足 条件,则设置断点,如 b 137 if i == n && j == m
  • runr):运行程序直到程序结束运行或遇到断点。
  • continuec):在程序遇到断点后继续执行,直到程序结束运行或到达下一个断点。
  • if <CONDITION>:用法同 b if
  • nextn):执行当前行语句,如果当前行有函数调用,则将其视为一个整体执行。
  • if <CONDITION>:用法同上。
  • steps):执行当前行语句,如果当前行有函数调用,则进入该函数内部。
  • finishfin):继续执行至当前函数返回。
  • call:调用某个函数,例如:call f(2)(以参数 2 调用函数 f)。
  • quitq):退出 gdb。
  • displaydisp):指定程序暂停时显示的表达式。
  • printp):打印表达式的值。
  • delete display <NUM> :删除第 个表达式
  • clear <NUM/FUNC>:删除断点

displayprint 指令都支持控制输出格式,其方法是在命令后紧跟 / 与格式字符,例如 p/d test(按照十进制打印变量 test 的值),

支持的格式字符有:

格式字符 对应格式
d 按十进制格式显示变量
x 按十六进制格式显示变量
a 按十六进制格式显示变量
t 按二进制格式显示变量
c 按字符格式显示变量
f 按浮点数格式显示变量
u 按十进制格式显示无符号整型
o 按八进制格式显示变量

注意如果有 breakpoint 一定优先在 breakpoint 停下,而不是取决于使用了 n 还是 s。

遇到 breakpoint 会在那一行停下来,然后显示代码。

一些常见异常返回值:

  • SIGFPE (8):除零异常。
  • SIGSEGV (11):无效内存,无权限写入。
  • SIGILL (4):堆栈溢出,数组越界破坏堆栈。

最后更新: May 9, 2023