温馨提示×

centos如何排查c++崩溃

小樊
59
2026-10-23 13:53:18
栏目: 编程语言

在 CentOS 上排查 C++ 程序崩溃,通常可以按下面思路逐步进行。


一、确认崩溃现象

先明确:

  • 程序是直接 core dump,还是异常退出?
  • 有无错误信息(Segmentation fault、Aborted 等)?
  • 崩溃是否可复现?
./your_program
# 或
dmesg | tail

二、开启并查看 Core Dump

1. 确认 core 文件是否生成

ulimit -c

如果是 0,需要开启:

ulimit -c unlimited

(仅对当前 shell 有效)

2. 查看 core 文件位置(CentOS 7+)

cat /proc/sys/kernel/core_pattern

常见:

  • core
  • core.%e.%p
  • /var/lib/systemd/coredump/...

如为 systemd:

coredumpctl list
coredumpctl gdb <pid>

三、使用 GDB 分析崩溃

1. 安装 GDB

yum install -y gdb

2. 直接调试运行

gdb ./your_program
run

崩溃后:

bt
bt full
info registers

3. 分析已有 core 文件

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>

五、常见崩溃原因排查

1. 段错误(Segmentation fault)

  • 空指针
  • 数组越界
  • 使用已释放内存
  • 栈溢出

2. 双重释放 / 内存 corruption

使用:

valgrind ./your_program

安装:

yum install -y valgrind

3. 未捕获异常

catch throw
run

(GDB 中)


六、日志与信号处理

捕获信号

#include <signal.h>
void handler(int sig) {
    abort(); // 生成 core
}
signal(SIGSEGV, handler);

打印堆栈(无需 GDB)

可用 backtrace():

#include <execinfo.h>
void print_stack() {
    void* bt[100];
    int n = backtrace(bt, 100);
    backtrace_symbols_fd(bt, n, STDERR_FILENO);
}

七、systemd 服务崩溃

如果是 systemd 服务:

journalctl -u your_service
coredumpctl list
coredumpctl gdb <pid>

八、典型排查流程总结

  1. ulimit -c unlimited
  2. 复现崩溃
  3. gdb ./app core
  4. bt 看堆栈
  5. 无符号 → 加 -g
  6. 内存问题 → valgrind
  7. 多线程 → thread apply all bt

如果你愿意,可以:

  • 贴出 崩溃信息 / core 栈
  • 说明 CentOS 版本 & 编译器
  • 是否是 多线程 / 服务程序

我可以帮你更具体地分析。

0 踩