- 论坛徽章:
- 0
|
(转自SCO OpenServer系统手册)
自陷、故障及异常
自陷、故障和异常是 CPU在为某个用户进程(在用户态或系统态执行)、在系统态执行的系统进程(例如,sched , vhand或bdflush之类系统精灵进程)或者中断例程执行指令时检
测到的特殊条件。这些特殊条件使 CPU切换到系统态,并且执行核心的的自陷处理程序。
如果自陷发生在用户态(换句话说,如果自陷由用户进程造成),核心通常向该进程发一
个信号。例如,如果一个进程执行了一条引起被零除错误的指令, CPU就产生一个被零除异常,自陷处理程序最终要向该进程发出一个SIGFPE(浮点出错)信号(参见signal ( S)手册贝
可得到所支持的信号的完整清单)。某些用户异常是合法的,不产生信号。例如,一个进程
可能要重新引用一个有效的指针,而该指针标识的是该进程数据段中一片已调出了主存储
器的数据。CPU则产生一个页故障,自陷处理程序就将此页数据从对换区装人内存,并且重新开始执行引起出错的指令。在这种情况下,自陷处理程序就不向进程发出信号。
然而,如果一个进程引用一个无效的指针(该指针可能已被破坏或未初始化),自陷处理
程序将确定不能从文件系统或对换区中装人相应的分页,并且向该进程发出一个SIGSEGV
(段损坏)信号。
除了在少数特殊场合下,不允许核心(换句话说,在执行系统调用、系统进程和中断例程时)"自已"产生自陷、故障和异常。如果核心不产生出错消息,那么情况就很严重,系统不能继续运行。自陷处理程序调用核心内部的一个特殊panic ( )例程,此例程中止系统执行。
当系统由于寻址错误而产生告急时, CUP寄存器的当前内容将显示在控制台上,该机器存储器的内容写到dumpdev设备(通常是对换设备)中,并且系统产生一个对核心 haltsys( )
函数的内部调用.
13.5.2控制台告急信急
写到控制台上的信息通常包括CPU寄存器的当前内容,以及核心出错消息和自陷号,为分析告急情况提供了有价值的信息。同样的显示信息也可以通过在已转储的设备上执行
crash(ADM)命令的panic功能得到。注意某些系统崩溃并不产生寄存器的转储。
系统出现告急时控制台的显示和下面的内容相似。行号仅作参考,并不出现在实际的显示内容中。
1 PANIC: NEED NEW DISPLAY
2 cr0 0x FFFFFFEB cr2 0x0 0FFFFFF cr3 0x00002000 tlb 0x00500E80
3 ss 0x00000038 uesp 0xD0119554 ef1 0x00010282 ipl 0x00000000
.......
8 PANIC : Kernel mode trap . Type ox0000000E
9 Trying to dump NNNN pages
10 &..........................................................
11&.............................................................
12 NNNN pages dumped
13 * * safe to power off
14 - or -
15 * * press Any key to reboot
NNNN的值取决于系统所配置的内存总量,在屏幕上显示的每个点都对应一个64K
的内存块(或者16个4K的页)。因此,内存配置较多的系统就比内存配置较少的系统有更 多的点
获取EIP值
EIP(指令指针)值可以通过系统告急时显示在控制台上的 CPU寄存器的内容计算得出。EIP值是核心在出现告急时正在执行的指令的地址。
要计算EIP值,将代码段(寄存器)和指令指针(eip寄存器)的寄存器值联起来成为一对数值,该值用逗号分隔,去掉前面的零。在上面的样本中,这两个值在第4行。cs的值为0xc00000158,eip的值为0xD007448, 因此,EIP值为158: D 0070488。
可以比较几次告急的值来确定该告急是由软件还是硬件原因造成的。三次或更多次同样的EIP值通常表示一个软件上的问题;连续几次告急具有不同的EIP值,表示硬件上的问
题,如内存板损坏。这并没有固定的规则,例如,有缺陷的RAM能产生多次具有相同的EIP
值的告急。
检查出错消息
在大多数情况下,PANIC出错消息显示在控制台上(例子中的第8行)。可以在/usr/adm/ messages文件中查找告急之前的其它消息,其中可能包含有价值的关于什么地方出错的信息。
核心出错消息报告驱动程序出错及核心其它部分出现的错误,例如,进程调度子系统和
文件子系统。经常监控这些消息是防止出现严重系统问题的一个重要步骤;在系统错误出
现之后研究这些消息是检修系统的一个重要组成部分。阅读PANIC出错消息能得到有关该系统故障原因的有价值的信息。
核心出错消息通常有以下格式:
class : [ ddname :] [ routine] message
class是以下之一:CONFIG,NOTICE,WARNING ,FATAL或PANIC。许多这样的消息都归档在messages(M)手册页中。
class类型为INIT的消息由 init(M)进程产生,并归档在 init(M)手册页中。这些消息通常在系统初始化过程中产生。有少数init消息指出了出错条件,但更多的只是通告性的消息。
ddname指出有问题的驱动程序或子系统的名字。实际的外部设备通常由一对数字表示,形式为major /minor。它标识错误发生的外部设备号。 routine选项指出检测到该条件的子系统;出错消息的这些部分主要用来帮助技术人员追踪困难的系统问题。
PANIC消息通常不记人/usr/adm/messages文件,但是告急出现之前所产生的其它消息通常都被记人日志,以提供关于该告急原因的有价值信息。PANIC消息通常显示在系统控
制台上或者可以用crash(ADM)命令的panic功能查看。
在13.5.2节"控制台告急信息"中的控制台转储示例中,PANIC消息没有遵循标准格式。这通常意味着错误是由主核心代码而非驱动程序引起。在这种情况下,该消息包含有引起该告急的自陷类型的定义。这些自陷号的意义在/usr/include/sys/trap.h 文件中定义
并且归档到messages(M)手册页。在这种情况下,出现的是调页违例,这通常发生在驱动程
序或其它核心代码引用游离指针的时候。
13.5.5 检查系统文件中的出错历史
系统管理许多包含历史信息的文件,可以提供查找出问题原因的线索。最有用的几个文件是:
/usr/adm/messages 由核心记录的所有控制台信息的日志,包括出错消息及系
统启动信息。
/etc/conf/cf.d /config.h/ 核心参数及其当前值的清单。同样的信息也可以用
configure(ADM)命令查看。当系统绘出CONFIG出错
消息时,这种信息是很有用的。
/dew/srting/cfg 己安装的驱动程序清单。同样的信息也可以用hwconfig(C)命令
查看。
检查系统配置
系统配置故障可以造成许多问题,系统可能没有正确链接,进程可能失败,或者只是系统以某种奇特方式运行。
如果在调整核心参数或者增加新的软件包或硬件设备后遇到系统问题,请检查系统配
置。所有这些活动都记录在系统日志本中。你也可以研究记录在/usr/adm/messages文件
中的启动统计数据;如果核心的大小在两次引导之间有改变,就说明配置已被修改。操作系
统包括许多命令,帮助你检查系统配置的方方面面。其中较为重要的一些命令如下:
/etc/conf/cf.d/configure - x |more
核心参数的值。也可以直接查看/etc/conf/cf.d/config.h文件中的信息。
可以用 sar(ADM)命令获得关于可调整资源是如何作用的性能统计数据。crash
(ADM)命令的strstat功能或 netstat -m命令显示所配置的STREAMS资源的统计数
据,包括自最近一次系统引导起已溢出的结构的信息。
/etc/sysdef
某些影响核心数据结构的可调参数的当前值。
/usr/bin/swconfig -p
已安装或已从系统中删除的软件包的历史和确认。
/usr/bin/hwconfig -h
已安装的驱动程序。某些在/etc/rc.d脚本中安装的内存映像及被排除在外的驱
动程序。这个信息也可以在/dev/string/cfg中看到。
/etc/custom
软件包是否已全部或部分安装。
/etc/custom -v quick SCO :unix RTS -x
确认运行系统文件的存在、权限及属主特性。-x标志说明要进行错误修复(在可
能存在的地方)。最重要的是,这条命令修复任何已损坏从而导致不能访问这些
文件的符号链接。上面的命令仅检查操作系统运行软件包。要检查整个系统,使
用命令:
/etc/custom - V quick -x
custom 将检查操作输出的副本保留在 custom.VerifyReport中。还有其它检查操作
选项,以完成不同级别的检查。
/usr/bin/displaypkg
显示用installpkg( ADM)实用程序安装的软件的有关信息。这类软件包不在
custom(ADM)或swconfig(ADM)报告中出现。
/tcb/bin/fixmog -v
纠正系统文件权限,以匹配授权数据库。使用-i选项可以在交互方式下执行,因为
系统在改正任何不一致情况之前都会提示你。
/tcb/bin/cps pathname
与fixmog类似,但仅检查指定的文件,而不是所有的系统文件。
13.6 使用 crash( ADM)命令检查内存转储
crash(ADM)命令提供大量有用信息,特别是在安装驱动程序或进行其它核心开发工作
时要对 UNIX系统内部构造有很好的理解,才能充分利用所提供的信息。本节中的注释使你
能够从crash输出中获得关于系统告急的一些基本信息。
要在/dev/swap设备的内存转储上运行crash (在系统重新引导进入单用户态之后,但
在进入多用户态之前)须发出一个类似下面的命令。该命令假定系统在发生告急时引导的是
/unix.test 核心映像,并且将所有输出保存到/tmp/crash.out 文件中:
/etc/crash -d /dev/swap -n /unix.test -w /tmp/crash..out
例如,为了在已由ldsysydump(ADM)命令根据/unix核心映像写到/tmp/06may94文
件的内存转储副本上运行crash,使用下面的命令
/etc/crash -d /tmp/06may94 -w /tmp/crash.out
研究告急
下面的清单勾画出确定引起系统告急的核心成分的过程。
( l) 必须在/etc/default/boot 文件中设置PANICBOOT:No,才能进行这个工作。
(2) 当系统出现告急时,从控制台显示中记下告急的类型、EIP值以及按页计算的内存转储
大小。
(3) 当机器重新引导时,保存dump设备上 的核心转储映像。
(4) 使机器进人单用户态。
(5) 在映像上运行crash (ADM)。
(6) 在crash 中使用panic命令,找到发生告急的例程。要确保自陷类型和 EIP与告急
发生后从控制台屏幕抄录的自陷类型和 EIP相匹配。
(7) 注意系统发生告急时正在执行的例程名字(符号名),这是 Kernel Stack before
Trap行下第一个列出的函数。
( 退出crash命令。
(9) 用strings(C)或nm(CP)来确定该例程所在的驱动程序。你可以执行如下脚本,此
脚本使用strings命令。
:
for FILE in 'find /etc/conf/pack.d -name '*.[oa]' - print'
do
strings $ FILE|grep $1 && echo $FILE
done
如果此脚本作为findpanic安装,你可以带一个给出核心例程名字的参数运行该命令。
findpanic symbol_name
该脚本输出如下:
routine_name
/etc/conf/pack.d/foo/Driver.o
这说明 fm驱动程序可能造成了系统告急。
13.6.3 从 SCO获得更多帮助
如果你不能确定系统告急的起因,你可能需要向 SCO技术支持部门寻求帮助。除了安
装检查清单和在"求助之前"中要求你提供的其它配置信息外,还应准备一份内存转储清单,
这对于分析故障原因是很有用的。为了提供这些资料:
(1) 将内存转储保存到磁带上,并且按照"从系统告急中恢复"中的讨论用 ldsysdump(ADM)
命令将它恢复到磁盘上。
(2) 用与下面类似的命令序列从转储中抽出关键的故障诊断报告:
#crash -d /tmp/06may94 -w /tmp/crash.out
> panic
> tracre
> user
> quit
记住,">"提示符是由 crash命令产生的,所以不用录入。这个命令序列将创建一
个包含crash命令的panic,trace和user功能输出的/tmp/crash.out文件。
(3) 打印出/tmp/crash.out 文件,传真或用电子邮件把该文件传送给技术支持人员。
(转自SCO OpenServer系统手册) |
|