1. 编译准备
# 使用 -g 选项编译,包含调试信息
gcc -g -o program program.c
2. 启动 GDB
gdb ./program # 调试可执行文件
gdb ./program core # 调试 core dump 文件
gdb -p <pid> # 附加到运行中的进程
3. 设置断点
(gdb) break main # 在 main 函数设置断点
(gdb) break file.c:42 # 在指定文件的行号设置断点
(gdb) break function_name # 在函数入口设置断点
(gdb) info breakpoints # 查看所有断点
4. 运行程序
(gdb) run [args] # 运行程序(可带参数)
(gdb) start # 运行并在 main 处停止
5. 单步执行
(gdb) next (n) # 单步执行(不进入函数)
(gdb) step (s) # 单步执行(进入函数)
(gdb) continue (c) # 继续执行到下一个断点
(gdb) finish # 执行到当前函数返回
6. 检查变量和内存
(gdb) print var # 打印变量值
(gdb) print *ptr # 打印指针指向的值
(gdb) display var # 每次停止时自动显示变量
(gdb) x/10x addr # 查看内存(16进制格式)
(gdb) info locals # 显示局部变量
(gdb) info args # 显示函数参数
7. 查看调用栈
(gdb) backtrace (bt) # 显示完整调用栈
(gdb) frame <n> # 切换到指定栈帧
(gdb) up/down # 在栈帧间移动
8. 常见错误诊断
段错误 (Segmentation Fault):
(gdb) run
# 程序崩溃后
(gdb) backtrace # 查看崩溃位置
(gdb) frame 0 # 查看崩溃的栈帧
(gdb) info registers # 查看寄存器状态
(gdb) print ptr # 检查可疑指针
死循环:
(gdb) run
# Ctrl+C 中断程序
(gdb) backtrace # 查看停在哪里
(gdb) print loop_var # 检查循环变量
内存泄漏/越界: 结合 Valgrind 使用更有效
valgrind --leak-check=full ./program
# 条件断点
(gdb) break file.c:42 if x == 0
# 监视点(变量改变时停止)
(gdb) watch variable
# 查看源代码
(gdb) list
(gdb) list function_name
# 修改变量值(测试修复)
(gdb) set var x = 10
# 保存调试会话
(gdb) set logging on
# 1. 启动并找到崩溃点
gdb ./program
(gdb) run
# 程序崩溃
(gdb) bt # 查看调用栈
(gdb) frame 0 # 进入崩溃栈帧
(gdb) list # 查看源码
(gdb) info locals # 检查局部变量
# 2. 重新运行,在崩溃前设断点
(gdb) break suspicious_function
(gdb) run
(gdb) step # 逐步执行
(gdb) print ptr # 检查变量状态
© 2026 myfk. All rights reserved.