GDB 调试指南
基础命令
命令 |
缩写 |
功能 |
run [参数] |
r |
启动程序 |
quit |
q |
退出 GDB |
list [行号] |
l |
查看源代码 |
help [命令] |
h |
查看帮助 |
backtrace [full] |
bt |
查看调用栈(包含局部变量) |
info [类型] |
i |
显示程序状态信息 |
print [表达式] |
p |
计算并显示表达式值 |
ptype [变量] |
|
查看变量类型 |
启动调试:
1 2
| gdb [可执行文件] (gdb) run [程序参数]
|
信息查看命令:
1 2 3 4
| (gdb) info functions (gdb) info variables (gdb) info locals (gdb) info args
|
断点操作
断点设置
命令 |
示例 |
说明 |
break [函数] |
b main |
函数入口断点 |
break [行号] |
b 15 |
当前文件行断点 |
break [文件]:[行] |
b test.c:20 |
指定文件行断点 |
break *[地址] |
b *0x4005a6 |
内存地址断点 |
tbreak |
tbreak 30 |
临时断点(触发一次) |
条件断点
1 2
| (gdb) break 25 if x==5 (gdb) break calculate if n>100
|
观察点
1 2 3
| (gdb) watch total_count (gdb) rwatch *0x7fffffffd0 (gdb) awatch ptr
|
断点管理
1 2 3 4 5 6 7 8
| (gdb) info breakpoints (gdb) disable 2 (gdb) enable 2 (gdb) delete 2 (gdb) commands 2 > print var > continue > end
|
数据查看与修改
基本查看
1 2 3 4
| (gdb) print my_var (gdb) print /x *ptr (gdb) print array[5]@10 (gdb) print $rax
|
结构体/对象查看
1 2
| (gdb) print *obj (gdb) print student.name
|
数据修改
1 2 3
| (gdb) set var count=0 (gdb) set $eax=0 (gdb) set {int}0x7fffffffdc=42
|
程序执行控制
命令 |
缩写 |
说明 |
continue |
c |
继续执行 |
step |
s |
单步进入(进入函数) |
next |
n |
单步越过(不进入函数) |
finish |
fin |
执行到函数返回 |
until [行号] |
u 30 |
运行到指定行 |
stepi |
si |
单条汇编指令(进入函数) |
nexti |
ni |
单条汇编指令(不进入函数) |
信号控制:
1 2
| (gdb) signal SIGINT (gdb) handle SIGSEGV stop
|
显示布局
命令 |
值 |
说明 |
layout |
asm |
显示汇编窗口 |
layout |
regs |
显示寄存器窗口 |
layout |
split |
同时显示源代码和汇编窗口 |
1 2 3
| (gdb) layout asm (gdb) layout regs (gdb) layout split
|
汇编级调试
命令 |
缩写 |
说明 |
stepi |
si |
执行一条汇编指令(可进入函数) |
nexti |
ni |
执行一条汇编指令(不进入函数) |
stepi [n] |
si 5 |
执行n条汇编指令 |
反汇编命令
1 2 3 4
| (gdb) disassemble (gdb) disassemble main (gdb) disassemble 0x400536,0x40054a (gdb) disassemble /m calculate
|
寄存器操作
1 2 3 4
| (gdb) info registers (gdb) info all-registers (gdb) print $rip (gdb) set $rax=0x10
|
执行控制
调用栈分析
1 2 3
| (gdb) backtrace full (gdb) frame 2 (gdb) info frame
|
内存操作完全指南
内存查看命令
格式说明:
格式 |
说明 |
示例 |
x |
十六进制 |
x/xw → 0xdeadbeef |
d |
有符号十进制 |
x/dw → -559038737 |
u |
无符号十进制 |
x/uw → 3735928559 |
o |
八进制 |
x/ow → 033653337357 |
t |
二进制 |
x/tw → 11011110… |
f |
浮点数 |
x/f → 1.2345 |
a |
地址 |
x/a → 0x400000 <_start> |
i |
指令 |
x/i → mov eax,0x1 |
c |
字符 |
x/c → ‘A’ |
s |
字符串 |
x/s → “Hello” |
单位说明:
单位 |
大小 |
说明 |
b |
1字节 |
Byte |
h |
2字节 |
Halfword |
w |
4字节 |
Word |
g |
8字节 |
Giant word |
内存操作示例
1 2 3 4 5
| (gdb) x/16xb buffer (gdb) x/4gf &dbl_array (gdb) x/10i $pc (gdb) x/s 0x4006b4 (gdb) x/20cb str_ptr
|
高级内存操作
1 2 3 4 5 6 7 8 9 10 11
| (gdb) find 0x400000, 0x401000, "secret"
(gdb) set {int}0x7fffffffdc=42
(gdb) compare-memory addr1 addr2 length
(gdb) dump binary memory dump.bin 0x400000 0x401000
|
内存断点
1 2 3
| (gdb) watch *0x7fffffffdc (gdb) awatch *ptr (gdb) rwatch -l *ptr
|
实例演示
示例程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #include <stdio.h> #include <string.h>
struct Data { int id; char name[20]; float score; };
int calculate(int n) { int sum = 0; for(int i=0; i<=n; i++) { sum += i; } return sum; }
int main() { int count = 10; char *str = "Debug Example"; float values[3] = {1.1, 2.2, 3.3}; struct Data student = {101, "Alice", 92.5}; int *ptr = &count; int result = calculate(count); printf("Result: %d\n", result); return 0; }
|
调试流程
- 编译程序
- 启动调试
- 设置断点
1 2 3
| (gdb) break main (gdb) break calculate (gdb) break 8 if i==5
|
- 运行程序
- 查看数据
1 2 3 4
| (gdb) print count (gdb) p values (gdb) p/x &student (gdb) x/20xb &student
|
- 汇编级调试
1 2 3
| (gdb) disassemble calculate (gdb) ni 5 (gdb) info registers
|
- 内存操作
1 2 3
| (gdb) x/3fw values (gdb) x/s str (gdb) watch sum
|
- 修改与继续
1 2 3
| (gdb) set var count=20 (gdb) set $eax=100 (gdb) continue
|
- 高级调试
1 2 3 4 5 6 7
| (gdb) disassemble /m main (gdb) tbreak printf (gdb) commands > backtrace > info args > continue > end
|
综合调试技巧
- 条件断点与命令
1 2 3 4 5
| (gdb) break 10 if sum > 100 (gdb) commands printf "i=%d, sum=%d\n", i, sum continue end
|
- 内存分析
1 2 3 4 5
| (gdb) p/x &count $1 = 0x7fffffffdc (gdb) x/wx 0x7fffffffdc (gdb) x/dw 0x7fffffffdc (gdb) set {int}0x7fffffffdc=42
|
- 调用栈分析
1 2 3
| (gdb) bt full (gdb) frame 1 (gdb) info locals
|
- 指令级调试
1 2 3 4
| (gdb) layout asm (gdb) layout regs (gdb) si (gdb) x/10i $pc
|
- 程序状态保存
1 2 3
| (gdb) checkpoint (gdb) restart ckpt_id (gdb) generate-core-file
|
总结图表
GDB 调试命令速查表
类别 |
常用命令 |
功能说明 |
基础 |
run , quit , list |
启动/退出/查看源码 |
断点 |
break , watch , tbreak |
断点设置与管理 |
数据 |
print , x , ptype |
变量查看与修改 |
执行 |
step , next , continue |
程序流程控制 |
汇编 |
disassemble , si , ni |
指令级调试 |
内存 |
x/格式 , set {type}addr |
内存操作 |
栈 |
backtrace , frame , info frame |
调用栈分析 |
信息 |
info , help |
状态查看与帮助 |
内存查看格式速查
命令 |
示例 |
输出说明 |
x/xw |
x/xw 0x400000 |
十六进制字 (0xdeadbeef) |
x/dw |
x/dw &count |
十进制有符号整数 |
x/tw |
x/tw &flags |
二进制表示 |
x/f |
x/f &pi |
浮点数值 |
x/i |
x/i $pc |
汇编指令 |
x/s |
x/s 0x4006b4 |
ASCII字符串 |
x/c |
x/10cb buffer |
字符序列 |
x/a |
x/a func_ptr |
地址和符号 |
在实际调试中结合使用help [command]
查看详细帮助信息。