在 CentOS 上运行 C++ 程序崩溃,通常可以按下面一套“排查流程”来定位和解决问题。
有没有报错信息?
./your_program
常见错误:
Segmentation fault (core dumped)Aborted (core dumped)double free or corruptionstd::bad_alloc是否生成了 core 文件?
ls -lh core*
CentOS 默认可能不生成 core 文件。
ulimit -c
如果是 0,需要打开:
ulimit -c unlimited
编辑 /etc/security/limits.conf:
* soft core unlimited
* hard core unlimited
gdb ./your_program
(gdb) run
崩溃后:
(gdb) bt
可以看到调用栈和崩溃行号。
gdb ./your_program core.xxxx
(gdb) bt
⚠️ 注意:编译时必须加
-g
g++ -g -O0 main.cpp -o main
最常见原因:
示例:
int* p = nullptr;
*p = 10; // 崩溃
排查工具:
valgrind ./your_program
valgrind --leak-check=full ./your_program
能发现:
工具:
helgrind ./your_program
ldd ./your_program
检查:
如果报错:
error while loading shared libraries
可设置:
export LD_LIBRARY_PATH=/your/lib/path:$LD_LIBRARY_PATH
std::cerr << "before func x" << std::endl;
assertassert(p != nullptr);
std::shared_ptr<T>
std::unique_ptr<T>
新编译的程序在旧 CentOS 上可能崩溃:
ldd --version
解决:
-static)yum install glibc-debuginfo
-g -O0bt如果你愿意,可以把:
cat /etc/centos-release)发出来,我可以帮你具体定位问题。