目录
在 Linux 下使用 GDB 调试 C 语言程序的流程与调试其他编译型程序类似,但针对 C 语言有一些更具体的操作方式。以下是详细步骤和常用技巧:
一、编译带调试信息的 C 程序
调试 C 程序前,必须用 -g 选项编译,确保生成包含调试信息的可执行文件:
gcc -g -o myapp myapp.c # 基本编译(myapp.c是源文件,myapp是输出的可执行文件)
# 若有多个源文件:
gcc -g -o myapp file1.c file2.c
-g 选项会保留变量名、行号等调试信息,否则 GDB 无法关联源代码。
二、启动 GDB 并加载程序
通过以下命令启动 GDB 并加载可执行文件:
gdb ./myapp
进入 GDB 交互界面后,提示符为 (gdb),此时可输入调试命令。
三、核心调试流程(以示例程序为例)
假设有一个简单的 C 程序 test.c:
#include <stdio.h>
int add(int a, int b) {
return a + b; // 第4行
}
int main() {
int x = 5, y = 3; // 第8行
int sum = add(x, y); // 第9行
printf("Sum: %d\n", sum); // 第10行
return 0; // 第11行
}
1. 设置断点
- 在指定行设置断点(如第 9 行):
gdb
(gdb) break 9 # 或简写 b 9 Breakpoint 1 at 0x119d: file test.c, line 9. - 在函数入口设置断点(如
add函数):gdb
(gdb) break add # 或 b add Breakpoint 2 at 0x1169: file test.c, line 4. - 查看所有断点:
gdb
(gdb) info breakpoints # 或 info b
2. 运行程序
gdb
(gdb) run # 或简写 r
Starting program: /path/to/myapp
Breakpoint 1, main () at test.c:9
9 int sum = add(x, y);
程序会在第一个断点(第 9 行)处暂停。
3. 查看变量与执行流程
- 打印变量值(如
x和y):gdb
(gdb) print x # 或 p x $1 = 5 (gdb) p y $2 = 3 - 单步执行(进入
add函数内部):gdb
(gdb) step # 或 s add (a=5, b=3) at test.c:4 4 return a + b; - 查看当前函数的参数(在
add函数内):gdb
(gdb) info args # 显示函数参数 a = 5 b = 3 - 继续执行到下一个断点或程序结束:
gdb
(gdb) continue # 或 c Sum: 8 [Inferior 1 (process 12345) exited normally]
四、常用调试命令(C 语言场景)
| 命令 | 功能描述 |
|---|---|
list 行号 或 l 行号 | 显示指定行附近的源代码(默认显示 10 行) |
next 或 n | 逐行执行(跳过函数调用,直接执行完函数) |
step 或 s | 逐行执行(进入函数调用内部) |
print 变量 或 p 变量 | 打印变量值(支持表达式,如 p x+1) |
set 变量=值 | 临时修改变量值(如 set x=10) |
backtrace 或 bt | 显示函数调用栈(查看当前程序执行路径) |
frame 编号 或 f 编号 | 切换到栈帧编号对应的函数(查看上层调用) |
delete 断点号 | 删除指定断点(如 delete 1) |
watch 变量 | 监视变量(当变量值改变时自动暂停) |
quit 或 q | 退出 GDB |
五、调试崩溃程序(Core Dump)
如果 C 程序崩溃(如段错误 Segmentation fault),可通过 core 文件定位问题:
- 开启 core 文件生成(默认可能关闭):
ulimit -c unlimited # 允许生成core文件(仅当前终端有效) - 运行程序,崩溃后会生成
core或core.xxx文件:./myapp Segmentation fault (core dumped) # 生成core文件 - 用 GDB 加载 core 文件分析:
gdb ./myapp core (gdb) bt # 查看崩溃时的函数调用栈,快速定位错误位置
六、实用技巧
- 条件断点:仅当条件满足时触发(适合循环中调试):
gdb
(gdb) break 10 if x > 100 # 第10行仅在x>100时暂停 - 宏定义调试:若程序使用宏,可用
info macro 宏名查看宏定义:gdb
(gdb) info macro MAX # 查看MAX宏的定义 - 保存调试会话:将常用命令写入
.gdbinit文件(如自动设置断点),GDB 启动时会自动执行。
通过以上步骤,可高效调试 C 语言程序中的逻辑错误、崩溃问题等。如需更详细的命令说明,可在 GDB 中输入 help 命令名(如 help break)查看。

被折叠的 条评论
为什么被折叠?



