C 语言调试流程 (GDB)

基本调试流程

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.