在 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 N 或 clear
- 退出: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 表达式(值变化时中断)。