gcc -g作用
一、示例
示例:
#include <stdio.h>
int divide(int a, int b) {
int result = a / b; // 可能触发除零错误
return result;
}
int main() {
int x = 10;
int y = 0;
printf("准备计算 %d/%d...\n", x, y);
int res = divide(x, y); // 这里会崩溃
printf("结果: %d\n", res);
return 0;
}
步骤 1:不使用 -g 编译调试
gcc debug_demo.c -o without_debug
./without_debug
输出:
准备计算 10/0...
[1] 28514 floating point exception (core dumped) ./without_debug
可以看到程序崩溃但无任何有用报错信息,无法定位错误位置。
步骤 2:使用 -g 编译调试
gcc -g debug_demo.c -o with_debug
gdb -q ./with_debug # -q 静默启动
在 GDB 中调试:
(gdb) run # 启动程序
准备计算 10/0...
Program received signal SIGFPE, Arithmetic exception.
0x000055555555515e in divide (a=10, b=0) at debug_demo.c:4
4 int result = a / b;
(gdb) backtrace # 查看调用栈
#0 0x000055555555515e in divide (a=10, b=0) at debug_demo.c:4
#1 0x00005555555551a6 in main () at debug_demo.c:13
(gdb) print b # 检查变量值
$1 = 0
(gdb) list # 显示附近源代码
1 #include <stdio.h>
2
3 int divide(int a, int b) {
4 int result = a / b;
5 return result;
6 }
...
步骤1和步骤2的关键调试信息对比:
| 功能 | 无 -g | 有 -g |
|---|---|---|
| 显示错误位置 | ❌ 仅内存地址 | ✅ 具体行号 (debug_demo.c:4) |
| 查看源代码 | ❌ 无 | ✅ list 命令可查看 |
| 检查变量值 | ❌ 只能看地址 | ✅ print b 显示实际值 |
| 函数名显示 | ❌ 仅机器符号 | ✅ 保留函数名 divide() |
| 堆栈追踪 | ❌ 无意义地址 | ✅ 显示完整调用路径 |
7886

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



