GDB 使用指北
记得加上 -g。
常用命令(转自 OI wiki):
list(l):列出程序源代码,如l main指定列出main函数附近的若干行代码。break(b):设置断点,如b main表示在main函数处设置断点。if <CONDITION>:如果满足条件,则设置断点,如 b 137 if i == n && j == mrun(r):运行程序直到程序结束运行或遇到断点。continue(c):在程序遇到断点后继续执行,直到程序结束运行或到达下一个断点。if <CONDITION>:用法同b ifnext(n):执行当前行语句,如果当前行有函数调用,则将其视为一个整体执行。if <CONDITION>:用法同上。step(s):执行当前行语句,如果当前行有函数调用,则进入该函数内部。finish(fin):继续执行至当前函数返回。call:调用某个函数,例如:call f(2)(以参数 2 调用函数 f)。quit(q):退出 gdb。display(disp):指定程序暂停时显示的表达式。print(p):打印表达式的值。delete display <NUM>:删除第个表达式 clear <NUM/FUNC>:删除断点
display 和 print 指令都支持控制输出格式,其方法是在命令后紧跟 / 与格式字符,例如 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