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。

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

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