crash
进程分析流程图
xml
[Start: vmcore loaded]
│
▼
┌───────────────────┐
│ 1. 全局进程概览 │
│ crash> ps │
└───────────────────┘
│
▼
┌─────────────────────────────────┐
│ 有无异常状态进程? (D, Z, R卡住) │
└─────────────────────────────────┘
│Yes │No
▼ ▼
┌─────────────────────────┐ ┌─────────────────────┐
│ 2. 查看运行队列 runq │ │ 说明进程状态正常, │
│ crash> runq │ │转向内核级分析(IRQ等)│
└─────────────────────────┘ └─────────────────────┘
│
▼
┌─────────────────────────┐
│ 3. 定位占用CPU进程 │
│ crash> ps -p <pid> │
│ crash> task <pid> │
└─────────────────────────┘
│
▼
┌─────────────────────────┐
│ 4. 调用栈分析 │
│ crash> bt <pid> │
│ crash> foreach bt │
│ (grep futex/lock/wait) │
└─────────────────────────┘
│
▼
┌─────────────────────────┐
│ 5. 线程卡住? │
│ crash> ps -T │
│ crash> bt -p <pid> │
└─────────────────────────┘
│
┌───────┴────────┐
│Yes │No
▼ ▼
┌─────────────────┐ ┌─────────────────────────┐
│ 6a. futex/锁卡住│ │ 6b. 内存/IO异常? │
│ → 死锁/竞争问题 │ │ crash> vm <pid> │
└─────────────────┘ │ crash> files <pid> │
│ crash> sig <pid> │
└─────────────────────────┘
📌 分析要点
-
ps
→ 谁在跑- 看状态 (R/S/D/Z),快速锁定异常进程。
-
runq
→ 谁占 CPU- 确认 load average 高是不是某些进程占满。
-
bt
/foreach bt
→ 卡在哪- 如果大量进程停在
futex_wait
,就是锁竞争。 - 如果卡在
schedule_timeout
,可能是 IO 卡住。
- 如果大量进程停在
-
vm
/files
→ 资源使用- 内存泄漏、文件句柄过多时一眼就能看到。
-
sig
→ 是否被信号干扰- 检查 SIGKILL、SIGSTOP 是否 pending。
📑 crash
详细解释(进程分析)
1. 查看进程列表
shell
crash> ps
显示所有进程(PID、状态、CPU、命令名)。
>
表示正在运行的进程ST
= 状态(R=running, S=sleeping, D=uninterruptible 等)
👉 快速了解 当机时系统在跑什么进程。
2. 查看特定进程
css
crash> ps -p <pid>
查看指定 PID 的进程。
示例:
css
crash> ps -p 1234
3. 查看线程
r
crash> ps -T
列出所有线程(包括内核线程、用户线程)。
👉 分析多线程进程卡住时很有用。
4. 查看 task_struct 信息
shell
crash> task <pid>
打印该进程的内核数据结构 task_struct
,包括:
- PID / TID / 状态
mm
(内存管理)files
(打开的文件)signal
(信号处理)
5. 查看进程调用栈
-
内核栈(task_struct 的内核调用栈)
shellcrash> bt <pid>
-
用户态栈(如果 core dump 包含用户空间信息)
csscrash> bt -p <pid>
👉 用于定位进程在当机时 卡在哪个函数。
6. 查看运行队列
shell
crash> runq
显示每个 CPU 上的运行队列,能看到 当时哪个进程占用 CPU。
7. 查找阻塞点
csharp
crash> foreach bt
遍历所有进程的内核栈,快速找到 阻塞的函数(如 futex_wait、schedule、mutex_lock 等)。
8. 查看内存映射
shell
crash> vm <pid>
显示该进程的虚拟内存布局(代码段、堆、栈、mmap)。
👉 用于排查 OOM 或段错误。
9. 文件描述符
shell
crash> files <pid>
显示进程打开的文件、socket、管道。
👉 排查句柄泄漏。
10. 信号信息
shell
crash> sig <pid>
查看进程信号状态(pending、blocked)。
👉 分析进程是否被杀或挂起。
✅ 实战建议
-
全局扫描卡住的点
perlcrash> foreach bt | grep -E "futex|lock|mutex|wait"
找出所有可能死锁的进程。
-
查看 CPU 占用
shellcrash> runq crash> ps
确认高负载进程。
-
检查 OOM 进程
shellcrash> vm <pid> crash> files <pid>
看内存和 fd 使用情况。