Solaris 模块调试器指南

附录 D 从 crash 转换

从使用传统的 crash 实用程序到使用 mdb(1) 的转换相对来说是简单的:MDB 提供了大多数“固定的”崩溃命令。通过 MDB 的其他可扩展性和交互功能,程序员可以了解当前命令集未检查的系统各方面。本附录简要讨论了 crash 的几项功能,并提供了指向等效 MDB 功能的指针。

命令行选项

mdb 不支持 crash -d-n-w 命令行选项。crash 转储文件和名称列表(符号表文件)按名称列表、崩溃转储文件的顺序指定为 mdb 的参数。 要检查实时内核,应该指定不带其他参数的 mdb -k 选项。 如果要将 mdb 的输出重定向到文件或其他输出目标,应该在命令行上使用 mdb 调用后跟相应的 shell 重定向运算符,或者使用 ::log 内置 dcmd。

MDB 中的输入

通常,MDB 中的输入与 crash 类似,但函数名称(在 MDB 中即为 dcmd 名称)的前缀为 "::"。 一些 MDB dcmd 接受位于 dcmd 名称前面的前导表达式参数。 与 crash 一样,字符串选项可以跟随 dcmd 名称。 如果函数调用后有 ! 字符,则 MDB 还将创建一个到指定 shell 管道的管道。 缺省情况下,在 MDB 中指定的所有即时值都是按十六进制解释的。即时值的基数说明符在 crash 和 MDB 中不同,如表 D–1 所示:

表 D–1 基数说明符

crash 

mdb 

基数 

0x 

0x 

十六进制(以 16 为基数) 

0d 

0t 

十进制(以 10 为基数) 

0b 

0i 

二进制(以 2 为基数) 

许多 crash 命令接受以槽号或槽范围作为输入参数。Solaris 操作系统不再是按照槽构建的,因此 MDB dcmd 未提供对槽号处理的支持。

函数

crash 函数 

mdb dcmd 

注释 

::dcmds 

列出可用的函数。 

!command 

!command 

转义到 shell 并执行命令。 

base 

在 mdb 中,= 格式字符可以用于将左侧的表达式值转换为任何已知格式。提供了八进制、十进制和十六进制格式。 

callout 

::callout 

列显调用表。 

class 

::class 

列显调度类。 

cpu 

::cpuinfo 

列显有关在系统 CPU 上分发的线程的信息。如果需要特定 CPU 结构的内容,则用户应该将 $<cpu 宏应用于 mdb 中的 CPU 地址。

help 

::help 

列显指定 dcmd 的说明或常规帮助信息。 

kfp 

::regs 

mdb ::regs dcmd 显示完整的内核寄存器集,包括当前的栈帧指针。$C dcmd 可以用于显示栈反向跟踪(包括帧指针)。 

kmalog 

::kmalog 

显示内核内存分配器事务日志中的事件。 

kmastat 

::kmastat 

列显内核内存分配器事务日志。 

kmausers 

::kmausers 

列显有关具有当前内存分配的内核内存分配器中等用户和大用户的信息。 

mount 

::fsinfo 

列显有关已挂载文件系统的信息。 

nm 

::nm 

列显符号类型和值信息。 

od 

::dump 

列显给定区域的带格式内存转储。在 mdb 中,::dump 以 ASCII 和十六进制混合显示区域的信息。 

proc 

::ps 

列显活动进程表。 

quit 

::quit 

退出调试器。 

rd 

::dump 

列显给定区域的带格式内存转储。在 mdb 中,::dump 以 ASCII 和十六进制混合显示区域的信息。 

redirect 

::log 

在 mdb 中,可以使用 ::log 以全局方式将输入和输出的输出重定向到日志文件。 

search 

::kgrep 

在 mdb 中,::kgrep dcmd 可以用于在内核的地址空间中搜索特定值。模式匹配内置 dcmd 也可以用于在物理、虚拟或目标文件地址空间中搜索模式。 

stack 

::stack 

可以使用 ::stack 获取当前栈跟踪。 可以使用 ::findstack dcmd 确定特定内核线程的栈跟踪。 可以使用 / 或 ::dump dcmd 以及当前的栈指针获取当前栈的内存转储。可以将 $<stackregs 宏应用于栈指针,以获取按帧保存的寄存器值。

status 

::status 

显示有关调试器正在检查的系统或转储的状态信息。 

stream 

::stream 

mdb ::stream dcmd 可以用于设置特定内核 STREAM 的结构的格式和显示该结构。如果需要活动的 STREAM 结构的列表,则用户应该在 mdb 中执行 ::walk stream_head_cache,并将生成的地址传输到相应的格式化 dcmd 或宏。 

strstat 

::kmastat 

::kmastat dcmd 显示 strstat 函数所报告的信息的超集。

trace 

::stack 

可以使用 ::stack 获取当前栈跟踪。可以使用 ::findstack dcmd 确定特定内核线程的栈跟踪。可以使用 / 或 ::dump dcmd 以及当前的栈指针获取当前栈的内存转储。可以将 $<stackregs 宏应用于栈指针,以获取按帧保存的寄存器值。

var 

$<v 

列显全局 var 结构中的可调系统参数。

vfs 

::fsinfo 

列显有关已挂载文件系统的信息。 

vtop 

::vtop 

列显给定虚拟地址的物理地址转换。