Ubuntu下用 GCC 与 GDB 调试的实用步骤
一 安装工具
- 更新索引并安装编译与调试工具:
- sudo apt update
- sudo apt install build-essential gdb
- 说明:build-essential 包含 gcc/g++、make 等常用开发工具;gdb 为 GNU 调试器。若需 C++ 调试,使用 g++ 编译即可。
二 编译时加入调试信息
- 使用 -g 生成调试信息,便于 GDB 映射源码与机器码;调试阶段建议关闭优化(使用 -O0),避免变量被优化导致无法打印或观察。
- 常用命令示例:
- C:gcc -g -O0 -o myprogram myprogram.c
- C++:g++ -g -O0 -o myprogram myprogram.cpp
- 可叠加更多告警以提前发现问题:gcc -Wall -Wextra -g -O0 hello.c -o hello。
三 使用 GDB 进行命令行调试
- 启动与运行
- 启动:gdb ./myprogram
- 运行:run(可带命令行参数,如 run arg1 arg2)
- 断点与执行控制
- 设置断点:break main 或 break myprogram.c:42
- 单步:next(不进入函数)/ step(进入函数)
- 继续:continue
- 查看状态
- 打印变量:print variable
- 调用栈:backtrace(或 bt)
- 局部变量/参数:info locals / info args
- 源码:list
- 修改变量/退出
- 修改变量:set variable var=val
- 退出:quit
- 小示例
- gcc -g -O0 -o myprogram myprogram.c
- gdb ./myprogram
- (gdb) break main
- (gdb) run
- (gdb) print a
- (gdb) continue
- (gdb) quit
四 进阶 内存错误检测与 VS Code 图形化调试
- AddressSanitizer 检测内存错误
- 编译:gcc -fsanitize=address -g -O1 -o myprogram myprogram.c
- 运行:./myprogram(遇到越界、使用未初始化内存等会输出详细报告)
- VS Code 调试配置(需安装 VS Code 与 C/C++ 扩展)
- 配置 .vscode/launch.json(使用 GDB)
- {
- “version”: “0.2.0”,
- “configurations”: [
- {
- “name”: “GCC Debug”,
- “type”: “cppdbg”,
- “request”: “launch”,
- “program”: “${workspaceFolder}/myprogram”,
- “args”: [],
- “stopAtEntry”: false,
- “cwd”: “${workspaceFolder}”,
- “environment”: [],
- “externalConsole”: false,
- “MIMode”: “gdb”,
- “miDebuggerPath”: “/usr/bin/gdb”,
- “setupCommands”: [{ “text”: “-enable-pretty-printing”, “ignoreFailures”: true }],
- “preLaunchTask”: “gcc build active file”
- }
- ]
- }
- 配置 .vscode/tasks.json(构建任务)
- {
- “version”: “2.0.0”,
- “tasks”: [
- {
- “label”: “gcc build active file”,
- “type”: “shell”,
- “command”: “gcc”,
- “args”: [“-g”, “${file}”, “-o”, “${fileDirname}/${fileBasenameNoExtension}”],
- “group”: { “kind”: “build”, “isDefault”: true },
- “problemMatcher”: [“$gcc”]
- }
- ]
- }
- 其他工具提示
- 性能分析可用 gprof:gcc -g -pg your_program.c -o your_program,运行后生成 gmon.out 再用 gprof 分析。
五 常见问题与建议
- 断点不停或变量不可见:通常是未加 -g 或开启了优化;请使用 -g -O0 重新编译。
- 源码行号对不上:确保调试用的可执行文件与当前源码一致,且未被 strip 过符号信息。
- 多线程/多进程调试:在 GDB 中使用 info threads、thread 切换线程,必要时配合 set follow-fork-mode 等命令。
- 段错误定位:先用 gdb 运行获取回溯(bt),再用 AddressSanitizer 精确定位内存问题。