排查 Linux 下 C++ 程序崩溃(crash / segfault / abort)一般按“先拿到现场 → 再定位代码 → 再分析原因”的流程来。下面是一套比较实用、从入门到进阶的排查方法。
常见崩溃表现:
Segmentation fault (core dumped)Aborted (core dumped)SIGABRT / SIGSEGV / SIGFPE 杀死先记录:
echo $?
常见信号:
ulimit -c unlimited
确认:
ulimit -c
cat /proc/sys/kernel/core_pattern
常见:
core.%e.%p
./your_program
生成类似:
core.12345
gdb ./your_program core.12345
bt
bt full
bt:调用栈bt full:栈 + 局部变量frame 0
list
print var
p *ptr
否则 GDB 看不了源码和变量。
g++ -g -O0 -o app main.cpp
推荐(生产也可):
-g -O2
不要:
strip
int* p = nullptr;
*p = 10;
GDB:
p p
int a[10];
a[100] = 1;
建议:
std::vectorg++ -fsanitize=address -g -o app main.cpp
./app
能发现:
-fsanitize=undefined
valgrind ./app
适合:
缺点:慢
#include <execinfo.h>
#include <signal.h>
void handler(int sig) {
void* bt[100];
int n = backtrace(bt, 100);
backtrace_symbols_fd(bt, n, STDERR_FILENO);
exit(1);
}
signal(SIGSEGV, handler);
-pthreadinfo threads
thread apply all bt
常见问题:
可用:
-fsanitize=thread
dmesg | tail
或:
journalctl -xe
如果崩溃难查:
ulimit -c unlimitedgdb 程序 corebt full如果你愿意,可以把:
bt 输出发出来,我可以帮你精确定位原因。