在 CentOS 上排查 C++ 程序崩溃,通常可以按下面思路逐步进行。
先明确:
./your_program
# 或
dmesg | tail
ulimit -c
如果是 0,需要开启:
ulimit -c unlimited
(仅对当前 shell 有效)
cat /proc/sys/kernel/core_pattern
常见:
corecore.%e.%p/var/lib/systemd/coredump/...如为 systemd:
coredumpctl list
coredumpctl gdb <pid>
yum install -y gdb
gdb ./your_program
run
崩溃后:
bt
bt full
info registers
gdb ./your_program core
或:
gdb -c core ./your_program
查看调用栈:
bt
thread apply all bt
如果 bt 显示 ??,说明没有符号。
-g -O0
yum install -y glibc-debuginfo
debuginfo-install <package>
使用:
valgrind ./your_program
安装:
yum install -y valgrind
catch throw
run
(GDB 中)
#include <signal.h>
void handler(int sig) {
abort(); // 生成 core
}
signal(SIGSEGV, handler);
可用 backtrace():
#include <execinfo.h>
void print_stack() {
void* bt[100];
int n = backtrace(bt, 100);
backtrace_symbols_fd(bt, n, STDERR_FILENO);
}
如果是 systemd 服务:
journalctl -u your_service
coredumpctl list
coredumpctl gdb <pid>
ulimit -c unlimitedgdb ./app corebt 看堆栈-gvalgrindthread apply all bt如果你愿意,可以:
我可以帮你更具体地分析。