温馨提示×

Linux C++如何查错

小樊
43
2026-08-16 01:16:44
栏目: 编程语言

在 Linux 下做 C++ 查错(调试),通常分几个层次:编译期、运行期、内存/性能、逻辑错误。下面给你一套实用、常用、从入门到进阶的查错方法。


一、编译阶段:把错误“提前暴露”

1️⃣ 打开所有警告(非常重要)

g++ -Wall -Wextra -Wpedantic -std=c++17 main.cpp -o main

常用警告选项:

  • -Wall:基本警告
  • -Wextra:更多警告
  • -Wpedantic:严格标准
  • -Werror:把警告当错误(可选)

大多数低级 bug 在编译期就能发现


2️⃣ Debug 版本(带调试信息)

g++ -g -O0 main.cpp -o main
  • -g:生成调试信息
  • -O0:关闭优化(方便调试)

⚠️ Release 编译不要带 -g


二、运行期查错(最直接)

1️⃣ 打印调试(最常用)

#include <iostream>
std::cout << "x = " << x << std::endl;

✅ 优点:简单
❌ 缺点:不适合复杂程序


三、使用 GDB 调试(最重要)

1️⃣ 安装

sudo apt install gdb

2️⃣ 启动调试

gdb ./main

3️⃣ 常用 GDB 命令

命令 说明
run 运行程序
break main 在 main 设断点
break test.cpp:20 在指定行设断点
next 下一行(不进函数)
step 进入函数
print x 打印变量
backtrace 查看调用栈
continue 继续执行
quit 退出

程序崩溃、段错误(Segmentation fault)必用


4️⃣ 查看段错误位置

gdb ./main
run
bt

四、内存错误(C++ 最常见)

1️⃣ 使用 Valgrind(强烈推荐)

sudo apt install valgrind
valgrind ./main

常用选项:

valgrind --leak-check=full ./main

能发现:

  • 内存泄漏
  • 使用未初始化变量
  • 越界访问
  • double free

C++ 查错神器


五、Sanitizer(现代 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

检测:

  • 除 0
  • 溢出
  • 未定义行为

比 Valgrind 更快


六、代码静态分析(提前发现问题)

1️⃣ clang-tidy

sudo apt install clang-tidy
clang-tidy main.cpp -- -std=c++17

能发现:

  • 不规范的写法
  • 潜在 bug
  • 现代 C++ 建议

七、逻辑错误调试技巧

1️⃣ 断言(assert)

#include <cassert>
assert(ptr != nullptr);

⚠️ Release 下 assert 会被禁用


2️⃣ 缩小范围

  • 二分法注释代码
  • 写最小可复现示例(MCVE)

八、常见错误速查表

现象 可能原因
Segmentation fault 空指针、越界
死循环 条件写错
输出乱码 未初始化变量
内存泄漏 new 后没 delete
随机崩溃 多线程竞争

九、推荐组合(实战)

日常开发推荐

g++ -Wall -Wextra -g -fsanitize=address,undefined main.cpp

复杂程序

  • GDB + Valgrind
  • 多线程:加 -fsanitize=thread

十、如果你愿意,我可以进一步帮你

你可以直接贴:

  • 报错信息
  • 崩溃时的 GDB 输出
  • Valgrind 报告
  • 一小段代码

我可以 逐行帮你分析错误原因

0