GDB命令笔记
冷若冰霜驱动盘
list
run
break
step next (n) # 单步执行(不进入函数)
quit
delete
continue (c) # 继续运行到下一个断点
watch x # 当变量x被修改时暂停
GDB(GNU Debugger)是Linux下最强大的代码调试工具,掌握其常用命令能快速定位程序崩溃、死锁、逻辑错误等问题。以下是按使用场景分类的GDB核心命令详解(附实例):
一、基础调试流程
1. 启动调试
bash
gdb ./your_program # 加载可执行文件 gdb -p <pid> # 附加到正在运行的进程
2. 设置断点
bash
b main # 在main函数入口设断点 b file.c:20 # 在file.c第20行设断点 b *0x4005a7 # 在内存地址0x4005a7设断点 b ClassA::func # 在类成员函数func设断点
3. 运行程序
bash
run # 从头运行程序 run arg1 arg2 # 带参数运行 continue (c) # 继续运行到下一个断点
4. 单步执行
bash
next (n) # 单步执行(不进入函数) step (s) # 单步执行(进入函数内部) finish # 执行完当前函数并暂停
二、查看程序状态
1. 查看变量/内存
bash
print x # 打印变量x的值 print *ptr@10 # 打印ptr指向的10个元素 print $rax # 打印寄存器rax的值 x/8wx 0x7fffffffe010 # 以16进制显示内存地址处的8个字(4字节)
2. 查看堆栈
bash
backtrace (bt) # 显示当前调用栈 frame 2 # 切换到调用栈第2层 info locals # 显示当前栈帧的局部变量
3. 监控点(Watchpoints)
bash
watch x # 当变量x被修改时暂停 watch *(int*)0x12345678 # 监控内存地址的值变化
三、高级调试技巧
1. 多线程调试
bash
info threads # 列出所有线程 thread 3 # 切换到线程3 b thread_test.c:37 thread 2 # 仅在线程2的指定位置断点
2. 条件断点
bash
b file.c:15 if x>100 # 当x>100时触发断点 ignore 1 5 # 忽略断点1的前5次触发
3. 修改程序状态
bash
set var x=42 # 修改变量x的值 call foo() # 强制调用函数foo()
四、崩溃分析(Core Dump)
bash
gdb ./your_program core # 加载崩溃转储文件 bt full # 显示完整调用栈(含局部变量) info registers # 查看崩溃时的寄存器值
五、实用命令速查
命令 | 作用 | 示例 |
---|---|---|
list (l) | 查看源代码 | l 10,20 (显示10-20行) |
info breakpoints | 查看所有断点 | |
disable/enable | 禁用/启用断点 | disable 1-3 |
disassemble | 反汇编当前函数 | disassemble /m main |
handle | 设置信号处理 | handle SIGSEGV stop print |
define | 自定义命令序列 | 见下方示例 |
六、实战调试示例
场景:调试段错误(Segmentation Fault)
bash
(gdb) run # 运行程序直到崩溃 Program received signal SIGSEGV, Segmentation fault. (gdb) bt # 查看崩溃位置 #0 0x000055555555516a in func (ptr=0x0) at test.c:8 #1 0x0000555555555196 in main () at test.c:15 (gdb) frame 0 # 切换到崩溃栈帧 (gdb) print ptr # 查看空指针 $1 = (int *) 0x0
自定义命令:打印链表
bash
define plistset $p = headwhile $p != 0print *$pset $p = $p->nextend end # 使用:plist
七、GDB可视化增强
-
TUI模式:
gdb -tui
或Ctrl+X A
切换文本界面(显示源码+汇编) -
插件推荐:
-
GEF:内存布局可视化、漏洞利用辅助
-
pwndbg:CTF/PWN专用增强
-
八、调试技巧总结
-
崩溃分析:优先用
bt
+info registers
定位异常位置 -
数据断点:用
watch
捕捉变量意外修改 -
多线程调试:用
thread apply all bt
打印所有线程堆栈 -
自动化:用
.gdbinit
文件预加载命令(如自定义函数)
⚠️ 注意:编译时务必加
-g
选项保留调试符号(gcc -g -o test test.c
)