温馨提示×

怎么调试Linux C++程序

小樊
37
2026-08-27 08:35:07
栏目: 编程语言

调试 Linux 上的 C++ 程序,常见方式从简单到专业如下。你可以按场景选择。


一、编译时准备(非常重要)

调试前一定要加 调试信息

g++ -g -O0 -o test test.cpp
  • -g:生成调试信息(必须)
  • -O0:关闭优化,避免变量被优化掉
  • -Wall -Wextra:打开常见警告(推荐)

二、使用 GDB 调试(最常用)

1️⃣ 启动 GDB

gdb ./test

2️⃣ 常用 GDB 命令

功能 命令
运行程序 run / r
设置断点 break main
行号断点 break test.cpp:10
条件断点 break 10 if i==5
单步执行 next / n
进入函数 step / s
查看变量 print i
查看堆栈 backtrace / bt
继续执行 continue / c
退出 quit

3️⃣ 调试崩溃(Segmentation fault)

gdb ./test
run
bt

bt 可以看到崩溃调用栈,非常关键。


三、使用 GDB 调试已运行程序

1️⃣ 查看进程 PID

ps aux | grep test

2️⃣ attach 到进程

gdb -p <pid>

退出时用:

detach
quit

四、调试多线程程序

info threads
thread 2
bt

常用:

  • 查看所有线程
  • 切换到指定线程
  • 查看线程堆栈

五、使用 Valgrind(内存问题)

1️⃣ 安装

sudo apt install valgrind

2️⃣ 检测内存泄漏

valgrind --leak-check=full ./test

适合:

  • 内存泄漏
  • 非法内存访问
  • 使用未初始化变量

六、使用 strace(系统调用调试)

strace ./test

适合:

  • 程序卡住
  • 文件/网络/权限问题
  • 看系统调用失败原因

七、使用日志调试(最实用)

#include <iostream>
#define DEBUG(x) std::cout << #x << " = " << x << std::endl

DEBUG(a);
DEBUG(vec.size());

或:

std::cerr << "[DEBUG] line " << __LINE__ << std::endl;

✅ 比 GDB 慢但直观
✅ 适合线上问题


八、IDE 调试(推荐新手)

1️⃣ VS Code

安装插件:

  • C/C++
  • GDB

配置 launch.json 即可图形化调试。

2️⃣ CLion

自带 GDB / LLDB,调试体验非常好。


九、调试流程建议(实战)

  1. 先加 -g -O0 编译
  2. 程序崩溃 → gdb + bt
  3. 逻辑错误 → 断点 + print
  4. 内存问题 → valgrind
  5. 系统问题 → strace
  6. 复杂问题 → 日志

十、常见坑

❌ 没加 -g
❌ 开了 -O2 导致变量不可见
❌ 调试 release 程序
❌ 多线程乱用 print


如果你愿意,可以告诉我:

  • 段错误 / 死循环 / 内存泄漏 / 多线程问题
  • 用的是 g++ / clang
  • 是否 服务器 / 嵌入式 / 桌面

我可以给你针对性的调试方案

0