core文件是系统软件出现问题后产生的信息记录。它对软件开发者和系统管理者的工作有很大的帮助作用。本节主要对Core文件产生和管理做一些初步介绍。
17.3.1 管理core文件概述
core文件在进程或者应用程序异常终止时产生。我们可以使用coreadm命令来管理core文件。比如,你可以使用coreadm命令来设定所有的core文件都放在一个目录中。这样,就会很容易通过测试找到问题的痕迹。
有两种类型的core文件:
单个进程的core文件,在默认情况下是启动的。当进程异常终止时,单个进程的core文件就在异常终止进程的目录中产生。产生后,单个进程的core文件的拥有者就是进程的拥有者。只有拥有者才能查看这个文件。
全局core文件,它默认的情况下是不开启的。如果启动了全局core文件,它产生在引起全局core文件产生的目录。全局core文件的拥有者就是超级用户。非特权用户不能查看全局core文件。
当进程异常终止时,默认在当前目录产生core文件。如果这时全局core文件路径也开启着,每个异常终止的进程就会有两个文件产生:一个在当前的工作目录;另一个在全局core文件目录。
默认时,setuid进程既不产生全局core文件也不产生单个core文件。
如果全局core文件是开启的,core文件可以用表17-3中的变量所描述。
表17-3 描述Core文件的变量
变 量 名
变量描述
%d
执行的文件目录名
%f
执行的文件名
%g
组的ID
%m
机器名称
续表
变 量 名
变量描述
%n
系统节点名
%p
进程ID
%t
十进制的时间
%u
有效的用户ID
%z
进程运行的分区(xone)名
%%
百分比
举例说明,全局core文件路径设置为:
/var/core/core.%f.%p
这时,如果sendmail的PID为12345的进程发生异常终止,将产生下列core文件:
/var/core/core.sendmail.12345
我们可以使用coreadm命令设定进程产生的core文件的目录和名称。这将取代原来的默认设置。
# coreadm -i /var/core/core.%f.%p
全局core的属性值存储在/etc/coreadm.conf文件中。
17.3.2 管理core文件的实例
1.显示当前core文件的设置
例17-2 使用不带任何参数的coreadm命令显示当前core的设置情况。
$ coreadm
global core file pattern:
global core file content: default
nit core file pattern: core
init core file content: default
global core dumps: disabled
per-process core dumps: enabled
global setid core dumps: disabled
per-process setid core dumps: disabled
global core dump logging: disabled
2.设置core文件名的样式
将当前Shell运行的所有进程所产生的core文件命名:
$ coreadm -p $HOME/corefiles/%f.%p $$
对全局文件设置core文件命名需要超级用户权限:
# coreadm -g /var/corefiles/%f.%p
3.启用单个进程core文件的路径
# coreadm -e process
$ coreadm $$
1180: /home/kryten/corefiles/%f.%p
4.启用全局core文件的路径
# coreadm -e global -g /var/core/core.%f.%p
17.3.3 查询core文件信息
一些proc工具可以像检测活动的进程一样检测core文件。比如,/usr/proc/bin/pstack、pmap、pldd、pflags和pcred工具能管理core文件。更详细的信息请查看porc(1)的帮助。
例17-3 使用proc工具检查core文件。
$ ./a.out
Segmentation Fault(coredump)
$ /usr/proc/bin/pstack ./core
core ’./core’ of 19305: ./a.out
000108c4 main (1, ffbef5cc, ffbef5d4, 20800, 0, 0) + 1c
00010880 _start (0, 0, 0, 0, 0, 0) + b8
17.4 系统crash信息的管理
crash主要反馈主机能否正常运行等比较严重的问题。系统管理员需要特别关注crash信息。
17.4.1 系统崩溃概述
系统崩溃(crash)发生在硬件故障、I/O问题或软件错误的情况下。如果系统崩溃发生了,它将在控制台上显示错误信息,并将物理内存的拷贝写入转储设备。这时,系统将自动重新启动。当系统重启后,savecore 命令运行将数据从转储设备中找回,并存储到savecore目录。这些数据为系统诊断提供了依据。
系统崩溃转储文件
当savecore命令自动运行将崩溃信息从转储设备中找回,并写成两个文件:unix.X和vmcore.X。其中X为转储的次序号码。这些文件一起用于表现系统的崩溃转储信息。
崩溃转储文件存储在预先设定好的目录中,默认情况下是/var/crash/hostname。在以前的Solaris版本中,崩溃转储文件将在系统重新启动的时候不写在特定的目录,除非你手动启动,将内存的映像存储到崩溃转储文件中。不过现在就自动存储崩溃转储文件了。
dumpadm命令
我们可以用dumpadm命令来在Solaris系统中管理系统崩溃转储信息。
dumpadm命令能使你在操作系统上设置崩溃转储。这个命令的设置参数包括转储的内容、转储的设备和崩溃转储信息的存储路径。
转储数据是以压缩的形式被存在转储设备中的。内核的崩溃转储映像可能达到4GB,压缩数据就意味着更快的转储速度和更小的转储设备磁盘空间。
保存崩溃转储文件是在后台运行的崩溃转储文件的任务。系统启动的时候不需要等待savecore命令完成就可以进行下一步。当然,大的内存数量是有利于savecore完成任务的。
系统崩溃转储文件是由savecore命令产生的,保存一般也是按默认路径进行的。
savecore –L命令是新的属性,它使你能在系统运行的时候崩溃转储。当系统内存存储有问题的时候,这个命令试图在系统运行的时候调试内存的快照。如果系统是启动的,并且有些命令还能执行,你可以运行cavecore –L命令来存储系统转储设备的快照到崩溃转储目录。
通过dumpadm命令,转储设置参数存储在/etc/dumpadm.conf文件中。注意不要手动编辑这个文件,这样做可能会带来不一致的转储设置。
dumpadm命令如何工作
当系统启动的时候,dumpadm命令调用svc:/system/dumpadm:default服务来设置基于/etc/dumpadm.conf文件的的崩溃转储参数。
dumpadm命令通过/dev/dump接口来初始化转储设备和转储内容。
17.4.2 管理系统崩溃转储信息
在管理系统崩溃信息中,你必须要记住以下几点:
你必须是超级用户或具有管理系统崩溃功能的用户。
不要关闭保存崩溃转储信息的属性。系统崩溃转储文件提供了导致系统崩溃的很珍贵的信息。
不要轻易删除系统崩溃信息。
1.如何显示当前的崩溃转储设置
# dumpadm
Dump content: kernel pages
Dump device: /dev/dsk/c0t3d0s1 (swap)
Savecore directory: /var/crash/venus
Savecore enabled: yes
上面输出的意义如下:
转储内容是内核内存的换页。
内核内存将转储到swap设备中,就是/dev/dsk/c0t3d0s1。
系统崩溃转储文件存在/var/crash/venus目录。
系统的崩溃转储功能是启动着的。
2.如何修改当前的崩溃转储设置
命令介绍
# dumpadm -c content -d dump-device -m nnnk | nnnm | nnn% -n -s savecore-dir
dumpadm命令的各个参数具体意义列在表17-4中。
表17-4 dumpadm命令的参数列表
转储参数
描 述
-c content
转储的数据类型。默认的转储内容是内核的内存。使用all关键字是指所有内存
-d dump-device
系统崩溃时,临时存储的专门设备
-m nnnk | nnnm | nnn%
在savecore目录中为了存储崩溃转储文件所留的专门空间。这个参数有可能是kb(nnnk),也有可能mb(nnnm),也有可能是百分比(nnn%)
-n 或-y
是否自动进行崩溃转储,y为是,n为否
-s savecore-dir
用来改变崩溃转储文件的路径。默认路径是/var/crash/hostname
例17-4 转储内容改为所有内存,转储目录改为/dev/dsk/c0t1d0s1,转储空间最大为这个文件系统的10%。
先查看原来的转储设置:
# dumpadm
Dump content: kernel pages
Dump device: /dev/dsk/c0t3d0s1 (swap)
Savecore directory: /var/crash/pluto
Savecore enabled: yes
更改转储设置:
# dumpadm -c all -d /dev/dsk/c0t1d0s1 -m 10%
Dump content: all pages
Dump device: /dev/dsk/c0t1d0s1 (dedicated)
Savecore directory: /var/crash/pluto (minfree = 77071KB)
Savecore enabled: yes
3.如何检查崩溃转储文件内容
例17-5 使用mdb工具输出崩溃转储文件内容,其中包括系统信息和在/etc/system文件中可调用的一些参数。
# /usr/bin/mdb -k unix.0
Loading modules: [ unix krtld genunix ip nfs ipc ptm ]
> ::status
debugging crash dump /dev/mem (64-bit) from ozlo
operating system: 5.10 Generic (sun4u)
> ::system
set ufs_ninode=0x9c40 [0t40000]
set ncsize=0x4e20 [0t20000]
set pt_cnt=0x400 [0t1024]
阅读(4732) | 评论(0) | 转发(0) |