温馨提示×

GCC在CentOS中如何调试

小樊
45
2025-12-23 06:47:49
栏目: 智能运维

在 CentOS 中使用 GCC 与 GDB 调试

一 安装必要工具

  • 在 CentOS 上先安装编译器与调试器,以及可选的构建工具:
    • 安装 GCC、G++、GDB、Make:
      • CentOS 7/8:sudo yum install -y gcc gcc-c++ gdb make
      • CentOS Stream 8/9 或已启用 EPEL:sudo dnf install -y gcc gcc-c++ gdb make
  • 验证安装:
    • gcc --version
    • gdb --version
  • 说明:GCC 负责编译,GDB 负责调试,两者配合完成源码级调试。

二 编译时生成调试信息

  • 使用 GCC 编译时务必添加 -g 选项,保留调试符号,便于 GDB 显示变量、行号与调用栈:
    • C 程序:gcc -g -O0 -o hello hello.c
    • C++ 程序:g++ -g -O0 -o hello hello.cpp
  • 建议同时关闭优化(如 -O0),避免变量被优化掉导致无法打印或观察;发布时再开启优化(如 -O2/-O3)。

三 使用 GDB 进行源码级调试

  • 启动与基本流程:
    • 启动:gdb ./hello
    • 设置断点:
      • 按函数:break main
      • 按文件行号:break hello.c:10
    • 运行:run(可带参数:run arg1 arg2
    • 单步:
      • 不进入函数:next(简写 n
      • 进入函数:step(简写 s
    • 继续执行:continue(简写 c
    • 打印与观察:
      • 打印变量:print var
      • 观察点(值改变时中断):watch var
    • 调用栈与栈帧:
      • 查看栈:backtrace(简写 bt
      • 切换栈帧:frame N
      • 查看局部变量:info locals
    • 其他常用:
      • 列出源码:list(简写 l
      • 删除断点:delete Nclear
      • 退出:quit
  • 小示例(在 main 中设断点并观察变量):
    • gcc -g -O0 -o hello hello.c
    • gdb ./hello
    • (gdb) break main
    • (gdb) run
    • (gdb) next
    • (gdb) print var
    • (gdb) continue
    • (gdb) quit

四 远程与内存调试工具

  • 远程调试(gdbserver):
    • 目标机运行:gdbserver :1234 ./hello
    • 本机连接:gdb ./hello,然后 (gdb) target remote <目标机IP>:1234
  • 内存与性能问题排查:
    • 内存错误与泄漏:valgrind --leak-check=full ./hello
  • 这些工具与 GDB 配合,可覆盖远程调试、内存错误定位等常见场景。

五 常见问题与实用建议

  • 断点不停或看不到变量:
    • 编译时未加 -g 或开启了优化(如 -O2/-O3),请改为 -g -O0 重新编译。
  • 缺少系统调试符号导致堆栈/变量显示不全:
    • GDB 可能提示:Missing separate debuginfos, use: debuginfo-install <包名>
    • 按提示安装对应 debuginfo 包(需已配置合适的软件源,如 yum-utils/dnf-utils 提供的 debuginfo-install)。
  • 多文件工程:
    • 直接编译整个工程生成可执行文件并在 GDB 中调试;确保链接阶段也包含调试信息(保持 -g)。
  • 条件断点与观察点:
    • 条件断点:break 行号 if 条件
    • 观察点:watch 表达式(值变化时中断)。

0