温馨提示×

Linux C++怎样进行调试

小樊
42
2026-08-27 11:34:04
栏目: 编程语言

Linux 下进行 C++ 调试,最常用、最成熟的方案是 GDB(GNU Debugger),配合 gcc/g++core dumpValgrindsanitizers 等工具。下面按使用场景给你一个系统性的说明。


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

1️⃣ 加调试信息

g++ -g -O0 main.cpp -o main

参数说明:

  • -g:生成调试信息(必须)
  • -O0:关闭优化(否则变量可能被优化掉)

调试一定要加 -g


二、使用 GDB 调试(核心工具)

1️⃣ 启动程序

gdb ./main

或:

gdb --args ./main arg1 arg2

2️⃣ 常用 GDB 命令(必会)

功能 命令
运行程序 run / r
设置断点 break main.cpp:10
查看断点 info break
单步执行 next / n
进入函数 step / s
继续执行 continue / c
打印变量 print x
查看堆栈 bt
查看当前代码 list
修改变量 set var x=10
退出 quit

3️⃣ 示例调试流程

gdb ./main
(gdb) break main
(gdb) run
(gdb) next
(gdb) print i
(gdb) bt

三、调试崩溃(Segmentation fault)

1️⃣ 使用 core dump(强烈推荐)

开启 core 文件

ulimit -c unlimited

运行程序,崩溃后会生成:

core 或 core.<pid>

用 GDB 分析

gdb ./main core

然后:

bt

✅ 可直接看到 崩溃位置


四、使用 Valgrind(内存问题)

1️⃣ 安装

sudo apt install valgrind

2️⃣ 检测内存错误

valgrind --tool=memcheck ./main

✅ 可发现:

  • 越界访问
  • 使用未初始化内存
  • 内存泄漏

五、使用 Sanitizers(现代 C++ 强烈推荐)

1️⃣ AddressSanitizer(内存错误)

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

✅ 能精准定位:

  • 栈/堆越界
  • use-after-free

2️⃣ UndefinedBehaviorSanitizer

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

3️⃣ ThreadSanitizer(多线程)

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

六、IDE / 图形化调试(可选)

1️⃣ VS Code(非常流行)

  • 安装插件:C/C++
  • 配置 launch.json
  • 支持:
    • 断点
    • 变量查看
    • 调用栈

✅ 本质还是调用 GDB


2️⃣ CLion

  • 自带调试器
  • 非常友好(商业软件)

七、调试技巧总结

调试顺序建议

  1. 编译加 -g
  2. gdb 单步跟踪
  3. 崩溃用 core + gdb
  4. 内存问题用 asan / valgrind
  5. 多线程用 tsan

八、常见错误排查

问题 原因
变量看不到 忘记 -g 或开了 -O2
bt 看不到栈 优化过度
core 文件没生成 ulimit -c 没开

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

  • 段错误 / 死循环 / 多线程 / 内存泄漏 哪一类?
  • 用的是 命令行还是 VS Code / CLion

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

0