在 Linux 下用 C++ 程序出现异常,原因很多,不能一概而论。下面按最常见 → 较少见的顺序,系统性地给你梳理一下,并给出排查方法。
这是 Linux 下 C++ 最常见的“异常”。
典型原因:
示例:
int* p = nullptr;
*p = 10; // 段错误
排查方法:
gdb ./your_program
run
bt
或:
ulimit -c unlimited
./your_program
gdb ./your_program core
#include <stdexcept>
void foo() {
throw std::runtime_error("error");
}
int main() {
foo(); // 没有 catch
}
现象:
terminate called after throwing an instance of 'std::runtime_error'
Aborted (core dumped)
解决:
try {
foo();
} catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
int* a = new int[10];
a[10] = 1; // 越界
特点:
排查工具:
valgrind ./your_program
现象:
symbol lookup error
undefined symbol
version `GLIBCXX_3.4.20' not found
检查:
ldd ./your_program
nm ./your_program | grep symbol
示例:
std::cout << "hello" << std::endl; // 多线程下可能崩
排查:
gdb ./a.out
thread apply all bt
-O2 / -O3 下未定义行为会被放大建议:
g++ -g -O0 -Wall -Wextra
Linux 中很多“异常”其实是 信号:
| 信号 | 含义 |
|---|---|
| SIGSEGV | 段错误 |
| SIGABRT | abort() |
| SIGFPE | 除 0 |
| SIGPIPE | 写已关闭的 socket |
| SIGBUS | 总线错误 |
示例:
int a = 1 / 0; // SIGFPE
exit()_exit()assert() 失败assert(ptr != nullptr);
gdb ./your_program
run
bt
ulimit -c unlimited
-Wall -Wextra -Werror
g++ -fsanitize=address -g main.cpp
你可以直接贴:
我可以帮你精确定位是哪一行代码导致的异常。