必须加-g,否则gdb无法设断点、查变量、看栈帧;-g在二进制中插入dwarf调试段,不影响逻辑,可与-o2等优化共存,但需确保所有源文件编译时均带-g,且未被strip删除。

-g 是必须加的,不加就进不了 GDB 断点、看不到变量、查不了栈帧
gcc/g++ 编译时必须显式加 -g 参数
默认编译(比如 g++ main.cpp -o main)完全不带调试信息。GDB 加载后会提示 No debugging symbols found,所有断点都无效,print 命令报错说变量未定义。
-
-g不影响生成的可执行逻辑,只往二进制里塞额外的 DWARF 调试段 - 它和优化参数不冲突,可以同时用:
g++ -g -O2 main.cpp -o main(但注意:-O2 可能导致局部变量被优化掉,info locals看不到) - 别信“只要装了 gdb 就自动有调试信息”——调试信息是编译时决定的,不是运行时补的
-g 和 -ggdb 的区别在哪
-ggdb 是 GCC 特供的“增强版 -g”,专为 GDB 优化,会包含更多细节(比如更完整的宏展开、内联函数上下文),但体积略大;普通 -g 已足够日常调试。
- 绝大多数场景用
-g即可,-ggdb主要在需要单步进入系统头文件或调试宏定义行为时才必要 -
-g3才真正包含宏定义信息,-g(即-g2)不包含宏,所以macro define相关命令在 GDB 里不可用 - 如果你用 VSCode + C/C++ 插件调试,它底层调的是 GDB,
-g完全够用,不用刻意换-ggdb
多文件项目里漏掉 -g 的常见坑
只给主文件加 -g 没用,每个参与链接的 .o 文件都得带调试信息,否则 GDB 在对应源文件里设不了断点、bt 栈帧会断在 ?? 行。
- 错误写法:
g++ -c a.cpp -o a.o(没-g) +g++ -g b.cpp -o main a.o b.o→a.cpp部分无调试信息 - 正确做法:所有
-c步骤都要加-g,或者统一用 CMake 并设置set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") - 检查是否生效:
readelf -S main | grep debug或file main输出里含with debug_info
调试信息不是“开关一开就万事大吉”,它依赖编译链上每一步都带上 -g,且不能被后续 strip 或 objcopy 误删——这是最常被忽略的隐性依赖。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











