在 Ubuntu 上排查 C/C++ 程序崩溃,通常可以按下面一套流程来定位和解决问题。
常见崩溃表现:
Segmentation fault (core dumped)double free or corruptionAborted (core dumped)ulimit -c
如果是 0,说明未开启。
ulimit -c unlimited
./your_program
崩溃后会生成:
core
core.<pid>
路径可能受
core_pattern影响:
cat /proc/sys/kernel/core_pattern
sudo apt install gdb
gdb ./your_program core
bt
或
bt full
示例输出:
#0 0x00007f... in foo() at main.cpp:42
#1 0x00007f... in main() at main.cpp:100
重点看:
适合必现崩溃:
gdb ./your_program
(gdb) run
崩溃后:
bt
-gg++ -g -O0 main.cpp -o app
-g:调试符号-O0:关闭优化(避免行号错乱)int* p = nullptr;
*p = 10; // segfault
排查:
bt 看函数栈print pint a[5];
a[10] = 1;
建议:
std::vector-fsanitize=address
g++ -g -fsanitize=address main.cpp -o app
./app
能直接报:
常见:
g++ -g -fsanitize=thread main.cpp -o app
std::cout << "before func" << std::endl;
#include <cassert>
assert(p != nullptr);
dmesg | tail
可看到内核记录的程序崩溃信息。
strace ./app
sudo apt install valgrind
valgrind ./app
-g -O0gdb bt 看崩溃点如果你愿意,可以把:
bt 结果发出来,我可以直接帮你定位问题。