温馨提示×

linux进程崩溃怎么排查

小樊
45
2026-09-09 13:29:53
栏目: 智能运维

在 Linux 下排查进程崩溃(crash / core dump / 段错误等),通常可以按下面思路逐步定位。


一、先确认“崩溃”的表现

先弄清楚进程是怎么死的:

  • 是直接退出(exit code 非 0)?
  • 段错误(Segmentation fault)
  • 是被信号杀死(SIGSEGV / SIGABRT / OOM)?
  • 是卡死后被 kill?
  • 是容器 / systemd 管理的服务?

常见信号含义:

  • SIGSEGV:非法内存访问
  • SIGABRT:主动 abort(如 assert 失败)
  • SIGKILL:被强制杀(如 OOM Killer)
  • SIGBUS:总线错误

二、查看退出原因(第一步)

1. 看退出码

echo $?
  • 139 → SIGSEGV (128+11)
  • 134 → SIGABRT (128+6)
  • 137 → SIGKILL (128+9,常见于 OOM)

2. 如果是 systemd 服务

journalctl -u your_service -n 200 --no-pager

3. 如果是容器

docker logs <container_id>
kubectl logs <pod> --previous

三、开启并分析 Core Dump(最重要)

1. 确认 core dump 是否开启

ulimit -c

如果是 0,说明没开:

ulimit -c unlimited

2. 查看 core 文件位置

cat /proc/sys/kernel/core_pattern

常见:

  • core
  • /var/lib/systemd/coredump/...

3. systemd 系统

coredumpctl list
coredumpctl info <pid>
coredumpctl gdb <pid>

4. 用 gdb 分析 core

gdb ./your_program core

常用:

bt            # 查看调用栈
bt full       # 详细栈
info registers
frame 0

四、运行时排查手段

1. 用 strace 看系统调用

strace -f -o trace.log ./your_program

看最后崩溃前调用了什么(如 open / malloc / mmap)。

2. 用 ltrace(库调用)

ltrace ./your_program

3. 内存问题(非常常见)

  • 野指针
  • 数组越界
  • double free
  • 栈溢出

使用:

valgrind --tool=memcheck ./your_program

或:

asan(编译时加 -fsanitize=address)

五、日志与代码层排查

1. 检查应用日志

  • stdout / stderr
  • /var/log/
  • 应用自身 log 文件

2. 加日志或 assert

关键路径:

  • 初始化
  • 网络收发
  • 线程创建
  • 资源释放

3. 确认是否是并发问题

  • 死锁
  • 数据竞争

工具:

-fsanitize=thread
helgrind

六、系统级原因

1. 内存不足(OOM)

dmesg | grep -i oom

或:

journalctl -k | grep -i oom

2. 文件描述符耗尽

ulimit -n
lsof -p <pid>

3. 磁盘 / 权限问题

  • 写日志失败
  • 配置文件不可读

七、快速排查清单(实战顺序)

  1. echo $?
  2. journalctl / logs
  3. 开 core + gdb bt
  4. strace 看最后一步
  5. valgrind / asan
  6. 查 OOM / 资源限制

如果你愿意,可以把崩溃信息、日志、语言(C/C++/Java/Go/Python)、是否容器发我,我可以直接帮你定位。

0