Solaris 模块调试器指南

入门:创建崩溃转储样例

本节说明如何获取崩溃转储样例以及如何调用 MDB 对其进行检查。

设置 kmem_flags

内核内存分配器包含许多高级调试功能,但是由于这些功能可能会导致性能下降,因此缺省情况下并未启用。为了理解本指南中的示例,您应该启用这些功能。应仅在测试系统中启用这些功能,因为它们可能会导致性能下降或暴露潜在的问题。

分配器的调试功能由 kmem_flags 可调参数控制。首先,请确保正确设置了 kmem_flags

# mdb -k

> kmem_flags/X

kmem_flags:

kmem_flags:     f

如果未将 kmem_flags 设置为 'f',则应该将以下行:

set kmem_flags=0xf

添加至 /etc/system,然后重新引导系统。系统重新引导时,请确认是否已将 kmem_flags 设置为 'f'。将此系统恢复为用于生产之前,请记住要删除对 /etc/system 的修改。

强制崩溃转储

下一步是确保正确配置了崩溃转储。首先,请确认是否将 dumpadm 配置为保存内核崩溃转储并启用了 savecore。 有关崩溃转储参数的更多信息,请参见 dumpadm(1M)

# dumpadm

		      Dump content: kernel pages

		       Dump device: /dev/dsk/c0t0d0s1 (swap)

		Savecore directory: /var/crash/testsystem

		  Savecore enabled: yes

接下来,使用 reboot(1M) 的 '-d' 标志重新引导系统,这将强制内核崩溃并保存崩溃转储。

# reboot -d

Sep 28 17:51:18 testsystem reboot: rebooted by root



panic[cpu0]/thread=70aacde0: forced crash dump initiated at user request



401fbb10 genunix:uadmin+55c (1, 1, 0, 6d700000, 5, 0)

  %l0-7: 00000000 00000000 00000000 00000000 00000000 00000000 00000000

         00000000

...

系统重新引导时,请确保崩溃转储已成功:

$ cd /var/crash/testsystem

$ ls

bounds    unix.0    unix.1    vmcore.0  vmcore.1

如果转储目录中缺少该转储,可能是由于分区的空间不足。 可以释放空间并以超级用户身份手动运行 savecore(1M),以便随后保存转储。如果转储目录包含多个崩溃转储,则刚创建的转储将是具有最新修改时间的 unix.[n]vmcore.[n] 对。

启动 MDB

现在,请对创建的崩溃转储运行 mdb 并检查其状态:

$ mdb unix.1 vmcore.1

Loading modules: [ unix krtld genunix ip nfs ipc ]

> ::status

debugging crash dump vmcore.1 (32-bit) from testsystem

operating system: 5.10 Generic (sun4u)

panic message: forced crash dump initiated at user request

在本指南提供的示例中,使用的是来自 32 位内核的崩溃转储。 此处提供的所有方法都适用于 64 位内核,并且已仔细区分了指针(其大小在 32 位和 64 位系统中不同)与固定大小的数量(相对于内核数据模型不变)。

UltraSPARC 工作站用于生成所提供的示例。您得到的结果可能随所使用系统的体系结构和型号的不同而不同。