使用 GDB(GNU Debugger) 调试 C 程序可以帮助你查找和修复代码中的错误。以下是使用 GDB 调试 C 程序的详细步骤:
1. 编译程序时启用调试信息
在使用 GDB 调试之前,需要在编译 C 程序时启用调试信息。调试信息会包含源代码、变量名、行号等信息,帮助 GDB 定位问题。
使用 -g 选项编译程序:
gcc -g -o my_program my_program.c
-g:生成调试信息。-o my_program:指定输出文件名为my_program。
2. 启动 GDB
编译完成后,使用 GDB 启动程序:
gdb ./my_program
这将启动 GDB 并加载你的程序。
3. 常用 GDB 命令
以下是一些常用的 GDB 命令及其功能:
运行程序
run或r:运行程序。
如果程序需要命令行参数,可以在(gdb) runrun后面加上参数:(gdb) run arg1 arg2
设置断点
break或b:在指定位置设置断点。- 在函数入口处设置断点:
(gdb) break main - 在指定行号设置断点:
(gdb) break my_program.c:10
- 在函数入口处设置断点:
查看断点
info breakpoints或i b:查看所有断点。(gdb) info breakpoints
删除断点
delete或d:删除指定断点。(gdb) delete 11是断点的编号,可以通过info breakpoints查看。
单步执行
next或n:执行下一行代码(不进入函数)。(gdb) nextstep或s:执行下一行代码(进入函数)。(gdb) step
继续执行
continue或c:继续执行程序,直到遇到下一个断点或程序结束。(gdb) continue
查看变量
print或p:打印变量的值。(gdb) print my_variable
查看源代码
list或l:显示当前代码行附近的源代码。
可以指定行号或函数名:(gdb) list(gdb) list 10 (gdb) list main
查看堆栈
backtrace或bt:查看函数调用堆栈。(gdb) backtrace
退出 GDB
quit或q:退出 GDB。(gdb) quit
4. 示例调试过程
假设有一个简单的 C 程序 my_program.c:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int x = 5;
int y = 10;
int z = add(x, y);
printf("Result: %d\n", z);
return 0;
}
调试步骤
-
编译程序:
gcc -g -o my_program my_program.c -
启动 GDB:
gdb ./my_program -
设置断点:
(gdb) break main -
运行程序:
(gdb) run -
单步执行:
(gdb) next -
查看变量:
(gdb) print x -
继续执行:
(gdb) continue -
退出 GDB:
(gdb) quit
5. 高级功能
-
条件断点:设置条件断点,当条件满足时触发。
(gdb) break my_program.c:10 if x == 5 -
观察点:监控变量的变化。
(gdb) watch x -
多线程调试:调试多线程程序。
(gdb) info threads (gdb) thread 2 -
反汇编:查看汇编代码。
(gdb) disassemble main
总结
GDB 是一个功能强大的调试工具,可以帮助你定位和修复 C 程序中的错误。通过设置断点、单步执行、查看变量等操作,你可以深入了解程序的运行状态。熟练掌握 GDB 的使用,可以显著提高调试效率。