1. solaris崩溃后我们在故障分析时除了在/var/adm/messages中查看故障前的系统日志,还希望了解故障当时的系统状态,运行了哪些进程,打开了什么文件,正在发生什么事件,有什么方法可以了解到这些信息呢?
2. 幸运的是solaris为我们提供了这样一个机制。solaris在panic崩溃后会在/var/crash/`hostname`目录下产生unix.x和vmcore.x文件,这两个文件记录了崩溃当时的系统状态,我们可以对他们进行分析,获取我们需要的信息
3. 分析方法:
我们可以mdb -k x或者mdb -k unix.x vmcore.x对系统dump文件分析,例如在/var/crash/hostname中有unix.3和vmcore.3,
执行命令:mdb -k 3
4. 常用分析命令
a. Crash时系统消息缓冲区的消息
该消息缓冲区是ring buffer,有很多有价值的信息,可以知道系统crash时或者之前很长一段时间的系统消息。
::msgbuf
> ::msgbuf MESSAGE sd94 at fjpfca1: target 11 lun b sd94 is /pci@81,2000/fibre-channel@1/sd@11,b WARNING: hme3: fault detected in device; service degraded WARNING: hme3: No response from Ethernet network : Link down -- cable problem? NOTICE: hme3: fault detected in device; service still degraded NOTICE: hme3: No response from Ethernet network : Link down -- cable problem?
b. 查看当时系统的进程
> ::ps S PID PPID PGID SID UID FLAGS ADDR NAME R 0 0 0 0 0 0x00000001 0000000001843840 sched R 3 0 0 0 0 0x00020001 0000030006d0f818 fsflush R 2 0 0 0 0 0x00020001 0000030006d10420 pageout R 1 0 0 0 0 0x42004000 0000030006d11028 init R 16365 1 16365 16365 100 0x42004000 0000030007d16028 oracle R 16338 1 16338 16338 100 0x42004000 000003012556eea8 oracle R 16336 1 16336 16336 100 0x42004000 00000300909ccdd8 oracle
c. 内存状态
1. 调用栈的backtrace
$c
::stack
::stackregs
2. 内核符号表
::nm
3. 反汇编
<内核函数>::dis
4. CPU寄存器
::regs
5. 调度队列(dispatch queue)
::cpuinfo -v
6. 物理内存及slab子系统
::memstat
::kmastat
7. 系统中所有进程
::ps
8. 所有内核线程
::threadlist
9. 线程状态
<kthread_t的地址>::thread
10. 某个内核线程调用栈
<kthread_t的地址>::findstack -v
<proc_t的地址>::walk thread |::findstack -v
11. 同步对象的状态
<mutex地址>::mutex
<读写锁的地址>::rwlock
12. 地址引用查找
<地址>::kgrep
<地址>::whatthread