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 enable
layout <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 行,可以用来快速跳出循环。
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