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 直到指令到达
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 enablelayout <name>layout src:显示源代码窗口layout asm:显示汇编窗口layout regs:显示源代码/汇编和寄存器窗口layout split:显示源代码和汇编窗口layout next:显示下一个 layoutlayout prev:显示上一个 layoutCtrl + L:刷新窗口Ctrl + x + 1: 单窗口模式,显示一个窗口Ctrl + x + 2:双窗口模式,显示两个窗口Ctrl + x + a:回到传统模式,即退出 layout,回到执行 layout 之前的调试窗口。Ctrl + x + o:切换聚焦窗口。focus src/asm/regs: 移动到某个窗口
Other tricks
until + <line>:直接执行到第 line 行,可以用来快速跳出循环。
setsymbol-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