Stepping

step(s)/stepi(si) + <n>: 执行 n 行 c/assembly 代码, 会跳进函数。
next(n)/nexti(ni) + <n>: 执行 n 行 c/assembly 代码,不会跳进函数。

Running

run/r: run code 直到遇到 breakpoint。程序跑完接着 run 会 restart 程序。
continue/c: 继续执行。
finish: run code 直到当前函数 return。
advance <location>: run code 直到指令到达。和设置 breakpoint 然后

Breakpoints

break <location>: 设置断点,location 可以是内存地址"*0x7c00"或者名称"mon_backtrace", "monitor.c:71"
break <location> if <condition>: 只有 condition 满足的时候才会 break。
cond <number> <condition>: 给某个断点增加 condition。 info breakpoints/b: 查看断点 delete <n>: 删除编号为 n 的断点

Watchpoints

watch <expression>: 表达式值发生改变时,会停止执行指令。
watch -l <address>: 内存地址的值发生改变时,会停止执行指令。
rwatch [-l] <expression>: 表达式值被 read 后,会停止执行指令。

Examining

x: 打印内存的原始数据,x/x十六进制,x/i汇编。
print/p: 打印 C expression。
x/s <内存地址>p (char*)<内存地址>: 打印字符串。
p $rax: 打印某个寄存器值。
info registers: 打印所有寄存器。
info frame: 打印当前栈帧。
list <location>: 打印具体位置的 source code。
backtrace

Layout

tui enable
layout <name>
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个 layout
layout prev:显示上一个 layout
Ctrl + L:刷新窗口
Ctrl + x + 1: 单窗口模式,显示一个窗口
Ctrl + x + 2:双窗口模式,显示两个窗口
Ctrl + x + a:回到传统模式,即退出 layout,回到执行 layout 之前的调试窗口。
Ctrl + x + o:切换聚焦窗口。
focus src/asm/regs: 移动到某个窗口

Other tricks

until + <line>:直接执行到第 line 行,可以用来快速跳出循环。

set
symbol-file

GDB 调试 core dump 文件

默认程序运行触发 core dump 是不会生成 core dump message 的,运行ulimit -c可以发现为 0.

生成 core dump 文件: ulimit -c unlimited
设置 core dump 文件路径为当前目录并写入系统环境变量。

if ! grep -qi 'kernel.core_pattern' /etc/sysctl.conf; then
  sudo sh -c 'echo "kernel.core_pattern=core.%p.%u.%s.%e.%t" >> /etc/sysctl.conf'
  sudo sysctl -p # 立即生效配置
fi

提供一个除 0 错误的 core dump 源代码test.c

int actual_calc(int a, int b){
  int c;
  c=a/b;
  return 0;
}

int calc(){
  int a;
  int b;
  a=13;
  b=0;
  actual_calc(a, b);
  return 0;
}

int main(){
  calc();
  return 0;
}

gcc -ggdb test.c -o test.out : -ggdb 生成使用 GDB 调试器所需的调试信息,而不仅仅是标准的 GDB 调试信息.
gdb ./test.out ./core.1341870.1000.8.test.out.1598867712

bt 查看出错情况的 backtrace。

(gdb) bt
#0  0x000056468844813b in actual_calc (a=13, b=0) at test.c:3
#1  0x0000564688448171 in calc () at test.c:12
#2  0x000056468844818a in main () at test.c:17

frame/f 2 查看第二帧信息。

Reference

https://linuxconfig.org/gdb-debugging-tutorial-for-beginners