在 Debian 中查看 GCC 调试信息的完整流程
一 编译时生成调试信息
- 安装基础工具:sudo apt update && sudo apt install build-essential gdb。
- 编译时加入调试符号:使用 -g;调试阶段建议关闭优化(不要使用 -O2/-O3),以避免变量被优化、行号错乱等问题。示例:
gcc -g -o hello hello.c
g++ -g -o hello hello.cpp
- 若需同时保留调试与优化,可用 -g -O2,但遇到断点、变量观察异常时优先改用 -O0 -g 排查。
二 验证可执行文件是否包含调试信息
- 使用 readelf 检查段信息:readelf -S your_program | grep -i debug。若能看到 .debug_info / .debug_line 等段,说明已包含调试信息。
- 也可用 file 命令查看概要:file your_program,通常会提示“not stripped”(未剥离符号)。
三 使用 GDB 查看与调试
- 启动:gdb ./your_program。
- 常用命令:
- 断点:break main 或 break file.c:10
- 运行:run(可带参数)
- 单步:next(不进函数)/ step(进入函数)
- 继续:continue
- 打印:print var
- 调用栈:backtrace(或 bt)
- 退出:quit
- 示例流程:
gdb ./hello
(gdb) break main
(gdb) run
(gdb) next / step / print x / bt / continue
四 进阶 查看编译日志与保留调试信息的发布
- 保存编译日志:
- 重定向:gcc -g -o app app.c > compile.log 2>&1
- 同时看终端并写入文件:gcc -g -o app app.c | tee compile.log
- 记录整场会话:script compile_session.log(执行完 exit 结束记录)
- 发布时剥离调试信息(减小体积):objcopy --only-keep-debug app app.debug && strip --strip-debug --strip-unneeded app && objcopy --add-gnu-debuglink=app app.debug。需要调试时再用 gdb 加载符号文件或在 GDB 中通过 set debug-file-directory 指定符号目录。
五 常见排错与建议
- 无法显示源码或断点无效:多半是编译未加 -g 或启用了高等级优化;改为 -O0 -g 重新编译。
- 系统库无调试符号导致堆栈不友好:可安装相应的 -dbg/-debug 包(如 libc6-dbg),或在 GDB 中使用 set debug-file-directory 指向已下载的符号目录。
- 多线程/内存问题:结合 ThreadSanitizer(-fsanitize=thread)、AddressSanitizer(-fsanitize=address) 或 Valgrind 做定位,它们与 -g 配合能输出更精确的行号与调用栈。