在 Linux 下做 C++ 查错(调试),通常分几个层次:编译期、运行期、内存/性能、逻辑错误。下面给你一套实用、常用、从入门到进阶的查错方法。
g++ -Wall -Wextra -Wpedantic -std=c++17 main.cpp -o main
常用警告选项:
-Wall:基本警告-Wextra:更多警告-Wpedantic:严格标准-Werror:把警告当错误(可选)✅ 大多数低级 bug 在编译期就能发现
g++ -g -O0 main.cpp -o main
-g:生成调试信息-O0:关闭优化(方便调试)⚠️ Release 编译不要带 -g
#include <iostream>
std::cout << "x = " << x << std::endl;
✅ 优点:简单
❌ 缺点:不适合复杂程序
sudo apt install gdb
gdb ./main
| 命令 | 说明 |
|---|---|
run |
运行程序 |
break main |
在 main 设断点 |
break test.cpp:20 |
在指定行设断点 |
next |
下一行(不进函数) |
step |
进入函数 |
print x |
打印变量 |
backtrace |
查看调用栈 |
continue |
继续执行 |
quit |
退出 |
✅ 程序崩溃、段错误(Segmentation fault)必用
gdb ./main
run
bt
sudo apt install valgrind
valgrind ./main
常用选项:
valgrind --leak-check=full ./main
能发现:
✅ C++ 查错神器
g++ -fsanitize=address -g main.cpp -o main
./main
能检测:
g++ -fsanitize=undefined -g main.cpp -o main
检测:
✅ 比 Valgrind 更快
sudo apt install clang-tidy
clang-tidy main.cpp -- -std=c++17
能发现:
#include <cassert>
assert(ptr != nullptr);
⚠️ Release 下 assert 会被禁用
| 现象 | 可能原因 |
|---|---|
| Segmentation fault | 空指针、越界 |
| 死循环 | 条件写错 |
| 输出乱码 | 未初始化变量 |
| 内存泄漏 | new 后没 delete |
| 随机崩溃 | 多线程竞争 |
✅ 日常开发推荐
g++ -Wall -Wextra -g -fsanitize=address,undefined main.cpp
✅ 复杂程序
-fsanitize=thread你可以直接贴:
我可以 逐行帮你分析错误原因 ✅