排查 Linux 下 C++ 程序崩溃,通常遵循“采集现场 → 定位崩溃点 → 分析原因 → 修复验证”的流程。下面按实战顺序给你一套可落地的方案。
echo $?
常见信号:
139 → SIGSEGV(段错误)134 → SIGABRT(assert / abort)132 → SIGILL(非法指令)136 → SIGFPE(除零等)ls -l core*
ulimit -c
若为 0,先开启:
ulimit -c unlimited
g++ -g -O0 -o app app.cpp
gdb ./app core
常用命令:
bt # 查看调用栈
bt full # 查看局部变量
frame 3 # 切换到第3层栈
info locals # 当前函数变量
p ptr # 打印变量
✅ 这是最快定位崩溃行的方式。
gdb ./app
run
崩溃时 gdb 会停住。
handle SIGSEGV stop print
run
最常见原因:
✅ 重点检查:
ptr->xxx
arr[i]
std::vector / map 越界
void f() { f(); } // 无限递归
✅ 检查:
✅ 工具:
helgrind
tsan
g++ -fsanitize=thread -g app.cpp
g++ -fsanitize=address -g -O1 app.cpp
./a.out
能精准报:
-fsanitize=undefined
std::cerr << "before call, ptr=" << ptr << std::endl;
#include <execinfo.h>
或在 main 中:
signal(SIGSEGV, handler);
dmesg | tail → 看内核记录strace ./app → 系统调用valgrind ./app → 内存分析(慢但强)1. 加 -g 编译
2. 开 core
3. gdb bt
4. 看变量 / 栈
5. asan 验证
6. 修复 + 单测
如果你愿意,可以把:
bt 输出)发出来,我可以直接帮你定位问题。