温馨提示×

ubuntu进程崩溃如何排查

小樊
39
2026-10-18 12:29:09
栏目: 智能运维

在 Ubuntu 上排查进程崩溃,可以按“先看现象 → 再拿日志 → 定位代码/资源 → 复现验证”的思路进行。下面是一套比较实用、从浅入深的排查方法。


一、确认崩溃现象

1. 进程是怎么死的?

  • 直接退出(exit code 非 0)
  • 被信号杀死(SIGSEGV、SIGABRT、SIGKILL 等)
  • 系统 OOM 杀掉(Out Of Memory)

查看退出信息:

echo $?

常见退出码:

  • 139 → SIGSEGV(段错误)
  • 134 → SIGABRT
  • 137 → SIGKILL(常被 OOM)

二、查看系统日志(最重要)

1. 使用 journalctl(推荐)

journalctl -xe
journalctl -u 服务名
journalctl --since "10 min ago"

如果是自己写的程序:

journalctl -p err

2. 查看内核日志

dmesg | tail -50

常见有用信息:

  • segfault at ...
  • Out of memory: Killed process ...
  • traps: xxx[12345] general protection fault

示例:

segfault at 0 ip 00007f... sp 00007ff... error 4

三、检查是否被 OOM 杀掉

dmesg | grep -i "killed process"

或:

grep -i "oom" /var/log/syslog

如果是 OOM:

  • 降低内存使用
  • 调整 ulimit
  • 增加 swap

四、使用 core dump 排查(强烈推荐)

1. 开启 core dump

ulimit -c unlimited

检查:

ulimit -c

2. 配置 core 文件位置(Ubuntu 默认用 apport)

cat /proc/sys/kernel/core_pattern

例如:

|/usr/share/apport/apport %p %s %c %d %P

core 文件通常在:

/var/crash/

3. 用 gdb 分析

gdb 可执行文件 core

常用命令:

bt          # 查看调用栈
bt full     # 详细栈
info locals # 局部变量

五、如果是服务(systemd)

1. 查看服务状态

systemctl status 服务名

2. 查看失败原因

journalctl -u 服务名 -b

3. 开启自动 core

编辑 service:

[Service]
LimitCORE=infinity

六、常见崩溃原因速查

现象 可能原因
SIGSEGV 空指针、越界、use-after-free
SIGABRT 断言失败、double free
进程突然消失 OOM / SIGKILL
CPU 100% 后死 死循环 / 死锁
间歇性崩溃 并发问题、资源泄漏

七、调试工具推荐

  • gdb:核心调试
  • valgrind:内存错误
valgrind ./程序
  • strace:系统调用
strace -f ./程序
  • lsof:文件/端口占用
  • htop / top:资源监控

八、一个标准排查流程示例

  1. journalctl -xe 看报错
  2. dmesg 看是否被 OOM / segfault
  3. 开启 ulimit -c unlimited
  4. 复现崩溃
  5. gdb 程序 core 看 bt
  6. 根据栈定位代码

如果你愿意,可以把:

  • 程序语言(C/C++/Python/Java…)
  • 崩溃日志或 dmesg 输出
  • 是命令行程序还是 systemd 服务

发出来,我可以帮你针对性分析。

0 踩