在 Ubuntu 上排查进程崩溃,可以按“先看现象 → 再拿日志 → 定位代码/资源 → 复现验证”的思路进行。下面是一套比较实用、从浅入深的排查方法。
查看退出信息:
echo $?
常见退出码:
139 → SIGSEGV(段错误)134 → SIGABRT137 → SIGKILL(常被 OOM)journalctl -xe
journalctl -u 服务名
journalctl --since "10 min ago"
如果是自己写的程序:
journalctl -p err
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
dmesg | grep -i "killed process"
或:
grep -i "oom" /var/log/syslog
如果是 OOM:
ulimitulimit -c unlimited
检查:
ulimit -c
cat /proc/sys/kernel/core_pattern
例如:
|/usr/share/apport/apport %p %s %c %d %P
core 文件通常在:
/var/crash/
gdb 可执行文件 core
常用命令:
bt # 查看调用栈
bt full # 详细栈
info locals # 局部变量
systemctl status 服务名
journalctl -u 服务名 -b
编辑 service:
[Service]
LimitCORE=infinity
| 现象 | 可能原因 |
|---|---|
| SIGSEGV | 空指针、越界、use-after-free |
| SIGABRT | 断言失败、double free |
| 进程突然消失 | OOM / SIGKILL |
| CPU 100% 后死 | 死循环 / 死锁 |
| 间歇性崩溃 | 并发问题、资源泄漏 |
gdb:核心调试valgrind:内存错误valgrind ./程序
strace:系统调用strace -f ./程序
lsof:文件/端口占用htop / top:资源监控journalctl -xe 看报错dmesg 看是否被 OOM / segfaultulimit -c unlimitedgdb 程序 core 看 bt如果你愿意,可以把:
dmesg 输出发出来,我可以帮你针对性分析。