冷若冰霜驱动盘
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 plist
set $p = head
while $p != 0
print *$p
set $p = $p->next
end
end
# 使用:plist
七、GDB可视化增强
八、调试技巧总结
-
崩溃分析 :优先用
bt
+info registers
定位异常位置 -
数据断点 :用
watch
捕捉变量意外修改 -
多线程调试 :用
thread apply all bt
打印所有线程堆栈 -
自动化 :用
.gdbinit
文件预加载命令(如自定义函数)
⚠️ 注意 :编译时务必加
-g
选项 保留调试符号(gcc -g -o test test.c
)