温馨提示×

Linux C++怎么调试

小樊
42
2026-07-17 05:48:57
栏目: 编程语言

在 Linux 下调试 C++ 程序,常用且高效的方式主要有 gdb、日志、sanitizer、IDE 集成调试 等。下面按常见场景给你一个实用指南。


一、最基础:用 gdb 调试(必会)

1️⃣ 编译时加调试信息

g++ -g -O0 main.cpp -o main
  • -g:生成调试信息
  • -O0:关闭优化(否则变量可能被优化掉)

2️⃣ 启动 gdb

gdb ./main

常用命令:

命令 作用
run / r 运行程序
break main 在 main 函数打断点
break test.cpp:10 在指定文件行号打断点
next / n 下一行(不进入函数)
step / s 进入函数
print x / p x 打印变量
backtrace / bt 查看调用栈
continue / c 继续执行
quit / q 退出

示例:

(gdb) break main
(gdb) run
(gdb) next
(gdb) print i

二、程序崩溃(Segmentation fault)

1️⃣ 直接 gdb 运行

gdb ./main
run

崩溃后:

bt

可以看到崩溃位置。


2️⃣ 使用 core dump(推荐)

开启 core dump

ulimit -c unlimited

运行程序,生成 core

./main

调试 core 文件

gdb ./main core
bt

三、内存问题:AddressSanitizer(强烈推荐)

比 gdb 更适合找 内存越界、野指针、double free

编译

g++ -fsanitize=address -g main.cpp -o main

运行

./main

✅ 优点:

  • 直接告诉你哪一行出错
  • 不需要手动打断点

四、多线程调试

gdb 常用命令

info threads
thread 2
bt

⚠️ 多线程 + gdb 容易卡,建议:

  • 先用 sanitizer
  • 或用 std::atomic / mutex 约束问题

五、日志调试(最常用)

#include <iostream>
#define DEBUG(x) std::cout << #x << " = " << x << std::endl
DEBUG(a);
DEBUG(vec.size());

适合:

  • 线上环境
  • 性能敏感代码

六、IDE 调试(更直观)

推荐

  • VS Code + gdb
  • CLion(最强)
  • Qt Creator

VS Code 示例(launch.json):

{
  "type": "cppdbg",
  "request": "launch",
  "program": "${workspaceFolder}/main",
  "args": [],
  "stopAtEntry": false,
  "cwd": "${workspaceFolder}",
  "externalConsole": false,
  "MIMode": "gdb"
}

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

✅ 推荐顺序:

  1. 编译加 -g -O0
  2. 先跑 AddressSanitizer
  3. 崩溃 → gdb + bt
  4. 逻辑错误 → 打印 / gdb 单步
  5. 复杂项目 → IDE

八、常见坑

❌ 优化级别太高(-O2)导致调试困难
❌ 没加 -g
❌ release 版调试 core 文件
❌ 多线程乱用 gdb(容易误判)


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

  • 段错误 / 死循环 / 多线程 / 内存泄漏
  • 用的是 命令行还是 VS Code / CLion
  • 程序规模(小 demo / 大型工程)?

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

0