温馨提示×

GCC在Debian中的调试信息如何查看

小樊
39
2026-01-01 10:51:57
栏目: 智能运维

在 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 配合能输出更精确的行号与调用栈。

0