Solaris的panic故障分析

时间:2021-03-19 23:38:38

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