必须加-g才能生成调试信息,否则gdb无法查看变量、单步执行或设断点;因调试信息显著增大体积且影响加载速度,故非默认选项。

要生成带调试信息的可执行文件,必须加 -g,否则 gdb 无法查看变量、单步执行或设置断点。
为什么 -g 不是默认选项
因为调试信息会显著增大二进制体积(可能翻倍),且影响加载速度;发布版本通常禁用它。GCC 默认不嵌入任何调试符号,-g 是显式开启的开关,不是“可选增强”,而是调试前提。
-
-g生成标准 DWARF 格式调试信息,兼容gdb、lldb和多数 IDE - 不加
-g时,即使源码在本地,gdb ./a.out也会提示No symbol table is loaded -
-g和优化选项(如-O2)可共存,但强烈建议调试阶段用-O0 -g:优化会重排代码、内联函数、删变量,导致源码行与实际执行严重错位
-g 的常见组合与陷阱
单独 -g 够用,但实际开发中常配合其他参数:
-
gcc -g -O0 hello.c -o hello:最安全的调试编译,禁用优化,符号完整,行号准确 -
gcc -g -O1 hello.c -o hello:轻度优化,部分变量可能被优化掉,但控制流仍较清晰 -
gcc -g3 hello.c -o hello:比-g更多宏定义信息(对调试宏逻辑有用),但非必需 - 避免
-g -O2或-g -O3:你会看到gdb跳行、变量显示为<optimized out></optimized>、断点设不上——这不是gdb坏了,是编译器真把那行干掉了
多文件项目怎么加调试信息
每个参与编译的源文件都需带 -g,否则对应目标文件(.o)里没调试符号,链接后缺失那部分就补不回来:
- 错误写法:
gcc -c main.c -o main.o && gcc -g utils.c -o utils.o && gcc main.o utils.o -o app→main.o无调试信息 - 正确写法:
gcc -g -c main.c -o main.o && gcc -g -c utils.c -o utils.o && gcc main.o utils.o -o app - 更稳妥:统一用 Makefile 或构建脚本,在
CFLAGS里固定写-g -O0,避免漏加
调试信息一旦没打进 .o 或最终二进制,事后没法“打补丁”——你得重新编译。最容易被忽略的是:只给主文件加 -g,忘了 utils.c、net.c 这些模块文件。











