Solaris 模块调试器指南

通用内核调试支持 (genunix)

内核内存分配器

本节讨论用于调试 Solaris 内核内存分配器所识别的问题以及检查内存和内存使用情况的 dcmd 和 walker。第 9 章,使用内核内存分配器进行调试中对此处所述的 dcmd 和 walker 进行了更详细的讨论。

dcmd

thread ::allocdby

在指定内核线程的地址的情况下,按反向时间顺序列显其已执行的内存分配的列表。

bufctl ::bufctl [-a address] [-c caller] [-e earliest] [-l latest] [-t thread]

列显指定的 bufctl addressbufctl 信息摘要。 如果存在一个或多个选项,则仅当 bufctl 与选项参数所定义的条件匹配时才会列显其信息;这样,可将 dcmd 用作来自管道的输入的过滤器。 -a 选项表示 bufctl 的对应缓冲区地址必须等于指定的地址。 -c 选项表示指定的调用方的程序计数器值必须存在于 bufctl 的已保存栈跟踪中。 -e 选项表示 bufctl 的时间标记必须晚于或等于指定的最早时间标记。 -l 选项表示 bufctl 的时间标记必须早于或等于指定的最早时间标记。 -t 选项表示 bufctl 的线程指针必须等于指定的线程地址。

[ address ] ::findleaks [-v]

对于启用了完整 kmem 调试功能集的内核崩溃转储,::findleaks dcmd 提供了强大高效的内存泄漏检测。 首次执行 ::findleaks 时会处理内存泄漏的转储(这可能需要几分钟),然后按分配栈跟踪合并泄漏。 findleaks 报告显示了所识别的每个内存泄漏的 bufctl 地址和最顶层的栈帧。

如果指定了 -v 选项,则 dcmd 在执行时会列显更详细的消息。 如果在 dcmd 前面指定了显式地址,则将过滤报告,并仅显示其分配栈跟踪包含指定函数地址的泄漏。

thread ::freedby

在指定内核线程的地址的情况下,按反向时间顺序列显其已执行的内存释放的列表。

value ::kgrep

在内核地址空间中搜索包含指定的指针大小值的指针对齐地址。 然后,列显包含匹配值的地址的列表。与 MDB 的内置搜索运算符不同,::kgrep 可搜索每段内核地址空间,并跨不连续的段边界搜索。 在大内核上,执行 ::kgrep 可能需要相当长的时间。

::kmalog [ slab | fail ]

显示内核内存分配器的事务日志中的事件。 事件按反向时间顺序显示,首先显示最新的事件。对于每个事件,::kmalog 都显示相对于最新事件的时间(用 T-差值表示法表示,例如 T-0.000151879)、bufctl、缓冲区地址、kmem 高速缓存名称和事件发生时的栈跟踪。 如果没有参数,则 ::kmalog 将显示 kmem 事务日志(仅当 kmem_flags 中设置 KMF_AUDIT 时它才存在)。::kmalog fail 显示分配失败日志,该日志会始终存在;这有助于调试未正确处理分配失败的驱动程序。::kmalog slab 显示长字节创建日志,该日志会始终存在。::kmalog slab 有助于搜索内存泄漏。

::kmastat

显示内核内存分配器高速缓存和虚拟内存块 (arena) 的列表,以及对应的统计信息。

::kmausers [-ef] [cache ...]

列显有关具有当前内存分配的内核内存分配器的中等用户和大用户的信息。对于每个唯一的栈跟踪,输出都包含一个项,用于指定总内存量和在该栈跟踪中进行的分配数。此 dcmd 要求在 kmem_flags 中设置 KMF_AUDIT 标志。

如果指定了一个或多个高速缓存名称(例如 kmem_alloc_256),则对内存使用情况的扫描仅限于那些高速缓存。 缺省情况下,包括所有高速缓存。 如果使用了 -e 选项,则包括分配器的小用户。 小用户是总数小于 1024 字节内存的分配或者同一栈跟踪中的分配数小于 10 的分配。 如果使用了 -f 选项,则会针对每个单独的分配列显栈跟踪。

[ address ] ::kmem_cache

对指定地址上存储的 kmem_cache 结构或完整的活动 kmem_cache 结构集进行格式设置和显示。

::kmem_log

显示完整的 kmem 事务日志集(按反向时间顺序排列)。 此 dcmd 使用比 ::kmalog 更简明的表格输出格式。

[ address ] ::kmem_verify

验证在指定地址上存储的 kmem_cache 结构或完整的活动 kmem_cache 结构集的完整性。如果指定了显式高速缓存地址,则 dcmd 会显示有关错误的详细信息;否则,显示摘要报告。内核内存高速缓存中对 ::kmem_verify dcmd 进行了更详细的讨论。

[ address ] ::vmem

对在指定地址上存储的 vmem 结构或完整的活动 vmem 结构集进行格式设置和显示。此结构在 <sys/vmem_impl.h> 中定义。

address ::vmem_seg

对在指定地址上存储的 vmem_seg 结构进行格式设置和显示。此结构在 <sys/vmem_impl.h> 中定义。

address ::whatis [-abv]

报告有关指定地址的信息。 具体来说,::whatis 会尝试确定该地址是指向 kmem 管理的缓冲区的指针还是其他类型的特殊内存区域(如线程栈),然后报告其判定结果。 如果存在 -a 选项,则 dcmd 会向其查询报告所有匹配项,而不仅仅是第一个匹配项。 如果存在 -b 选项,则 dcmd 还会尝试确定该地址是否通过已知的 kmem bufctl 被引用。 如果存在 -v 选项,则 dcmd 在搜索各种内核数据结构时会报告其进度。

Walker

allocdby

在指定 kthread_t 结构的地址作为起点的情况下,迭代与此内核线程执行的内存分配相对应的 bufctl 结构集。

bufctl

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的分配的 bufctl 集。

freectl

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的空闲 bufctl 集。

freedby

在指定 kthread_t 结构的地址作为起点的情况下,迭代与此内核线程执行的内存取消分配相对应的 bufctl 结构集。

freemem

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的空闲缓冲区集。

kmem

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的分配的缓冲区集。

kmem_cache

迭代活动的 kmem_cache_t 结构集。 此结构在 <sys/kmem_impl.h> 中定义。

kmem_cpu_cache

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代与此高速缓存关联的每个 CPU 的 kmem_cpu_cache_t 结构。 此结构在 <sys/kmem_impl.h> 中定义。

kmem_slab

在指定 kmem_cache_t 结构的地址作为起点的情况下,迭代关联的 kmem_slab_t 结构集。 此结构在 <sys/kmem_impl.h> 中定义。

kmem_log

迭代存储在 kmem 分配器事务日志中的 bufctl 集。

leak

在指定 bufctl 结构的地址的情况下,迭代与具有类似分配栈跟踪的泄漏内存缓冲区相对应的 bufctl 结构集。必须首先应用 ::findleaks dcmd 查找内存泄漏,然后才能使用 leak walker。

leakbuf

在指定 bufctl 结构的地址的情况下,迭代与具有类似分配栈跟踪的泄漏内存缓冲区相对应的缓冲区地址集。必须首先应用 ::findleaks dcmd 查找内存泄漏,然后才能使用 leakbuf walker。

文件系统

MDB 文件系统调试支持包括一个内置工具,用于将 vnode 指针转换为对应文件系统的路径名。 此转换是使用目录名称查找高速缓存 (Directory Name Lookup Cache, DNLC) 执行的;由于高速缓存并不包含所有的活动 vnode,因此可能无法将某些 vnode 转换为路径名,并且显示的是 "??" 而不是名称。

dcmd

::fsinfo

显示挂载的文件系统表,包括 vfs_t 地址、ops 向量和每个文件系统的挂载点。

::lminfo

显示已向锁定管理器注册其活动网络锁定的 vnode 表。 将会显示对应于每个 vnode 的路径名。

address ::vnode2path [-v]

显示对应于指定 vnode 地址的路径名。如果指定了 -v 选项,则 dcmd 列显更详细的显示,其中包括每个中间路径组件的 vnode 指针。

Walker

buf

迭代活动的块 I/O 传输结构集(buf_t 结构)。 buf 结构在 <sys/buf.h> 中定义,buf(9S) 中对其进行了更详细的介绍。

虚拟内存

本节介绍对内核虚拟内存子系统的调试支持。

dcmd

address ::addr2smap [offset]

列显与内核 segmap 地址空间段中的指定地址相对应的 smap 结构地址。

as ::as2proc

显示与 as_t 地址 as 相对应的进程的 proc_t 地址。

[ address ] ::memlist [-aiv]

显示指定的 memlist 结构或已知的 memlist 结构之一。 如果不存在 memlist 地址和选项,或者如果存在 -i 选项,则显示表示以物理方式安装的内存的 memlist。 如果存在 -a 选项,则显示表示可用物理内存的 memlist。 如果存在 -v 选项,则显示表示可用虚拟内存的 memlist。

::memstat

显示系统范围的内存使用情况摘要。 将会显示不同类别的页面(内核、匿名内存、可执行文件和库、页面高速缓存和空闲列表)所占用的系统内存量和百分比,以及总系统内存量。

[ address ] ::page

显示指定的 page_t 的属性。 如果未指定任何 page_t 地址,则 dcmd 会显示所有系统页面的属性。

seg ::seg

对指定的地址空间段(seg_t 地址)进行格式设置和显示。

[ address ] ::swapinfo

显示有关所有活动的 swapinfo 结构或指定结构 swapinfo 的信息。 将会显示每个结构的 vnode、文件名和统计信息。

vnode ::vnode2smap [offset]

列显与指定的 vnode_t 地址和偏移相对应的 smap 结构地址。

Walker

anon

在指定 anon_map 结构的地址作为起点的情况下,迭代相关的 anon 结构集。 anon 映射实现在 <vm/anon.h> 中定义。

memlist

迭代指定的 memlist 结构的各个跨度。 此 walker 可以与 ::memlist dcmd 联合使用以显示每个跨度。

page

迭代所有系统的 page 结构。 如果为 walk 指定了显式地址,则会将其视为 vnode 的地址,并且 walker 仅迭代与该 vnode 关联的那些页面。

seg

在指定 as_t 结构的地址作为起点的情况下,迭代与指定地址空间关联的地址空间段集(seg 结构)。seg 结构在 <vm/seg.h> 中定义。

swapinfo

迭代活动 swapinfo 结构的列表。此 walker 可以与 ::swapinfo dcmd 联合使用。

CPU 和分发程序

本节介绍用于检查 cpu 结构和内核分发程序的状态的工具。

dcmd

::callout

显示调用表。将会显示每次调用的函数、参数和失效时间。

::class

显示调度类表。

[ cpuid ] ::cpuinfo [-v]

显示当前在每个 CPU 上执行的线程表。 如果在 dcmd 名称前面指定了可选的 CPU ID 号或 CPU 结构地址,则仅显示有关指定 CPU 的信息。如果存在 -v 选项,则 ::cpuinfo 还会显示等待在每个 CPU 上执行的可运行线程以及活动的中断线程。

Walker

cpu

迭代内核 CPU 结构集。cpu_t 结构在 <sys/cpuvar.h> 中定义。

设备驱动程序和 DDI 框架

本节介绍对内核开发者以及第三方设备驱动程序开发者均有所帮助的 dcmd 和 walker。

dcmd

address ::binding_hash_entry

在指定内核名称到主设备号的绑定散列表项的地址(结构 bind)的情况下,显示节点绑定名称、主设备号和指向下一个元素的指针。

::devbindings device-name

显示指定驱动程序的所有实例的列表。输出包括对应于每个实例的项(从指向结构 dev_info 的指针开始,可使用 $<devinfo::devinfo 查看此结构)、驱动程序名称、实例编号以及与该实例关联的驱动程序和系统属性。

address ::devinfo [ -q ]

列显与 devinfo 节点关联的系统和驱动程序属性。如果指定了 -q 选项,则仅显示设备节点的核心摘要。

address ::devinfo2driver

列显与 devinfo 节点关联的驱动程序的名称(如果有)。

[ address ] ::devnames [ -v ]

显示内核的 devnames 表以及指向驱动程序实例列表的 dn_head 指针。 如果指定了 -v 标志,则显示在 devnames 表的各项中存储的其他信息。

[ devinfo ] ::prtconf [ -cpv ]

devinfo 指定的设备节点开始显示内核设备树。 如果未提供 devinfo,则缺省情况下假定从设备树的根开始。 如果指定了 -c 选项,则仅显示指定设备节点的子节点。 如果指定了 -p 选项,则仅显示指定设备节点的祖先。 如果指定了 -v,则显示与每个节点关联的属性。

[ major-num ] ::major2name [ major-num ]

显示与指定的主设备号相对应的驱动程序名称。可以将主设备号指定为 dcmd 前面的表达式或指定为命令行参数。

[ address ] ::modctl2devinfo

列显与指定的 modctl 地址相对应的所有设备节点。

::name2major driver-name

在指定设备驱动程序名称的情况下,显示其主设备号。

[ address ] ::softstate [ instance-number ]

在指定 softstate 状态指针(请参见 ddi_soft_state_init(9F))和设备实例编号的情况下,显示该实例的软状态。

Walker

binding_hash

在指定内核绑定散列表项的数组的地址(结构 bind **)的情况下,遍历散列表中的所有项,并返回每个结构 bind 的地址。

devinfo

首先,迭代指定 devinfo 的父级,然后按级别从高到低的顺序将其返回。 其次,返回指定的 devinfo 本身。 第三,按级别从高到低的顺序迭代指定 devinfo 的子级。 dev_info 结构在 <sys/ddi_impldefs.h> 中定义。

devinfo_children

首先,返回指定的 devinfo,然后按级别从高到低的顺序迭代指定 devinfo 的子级。dev_info 结构在 <sys/ddi_impldefs.h> 中定义。

devinfo_parents

按级别从高到低的顺序迭代指定 devinfo 的父级,然后返回指定的 devinfo。 dev_info 结构在 <sys/ddi_impldefs.h> 中定义。

devi_next

迭代指定 devinfo 的同级。dev_info 结构在 <sys/ddi_impldefs.h> 中定义。

devnames

迭代 devnames 数组中的项。此结构在 <sys/autoconf.h> 中定义。

softstate

在指定 softstate 指针(请参见 ddi_soft_state_init (9F))的情况下,显示指向驱动程序状态结构的所有非 NULL 指针。

softstate_all

在指定 softstate 指针(请参见 ddi_soft_state_init(9F))的情况下,显示指向驱动程序状态结构的所有指针。请注意,未使用的实例的指针将为 NULL。

STREAMS

本节介绍对内核开发者以及第三方 STREAMS 模块和驱动程序的开发者均有所帮助的 dcmd 和 walker。

dcmd

address ::mblk2dblk

在指定 mblk_t 的地址的情况下,列显对应的 dblk_t 的地址。

[address] ::mblk_verify

验证一个或多个消息块的完整性。如果指定了显式消息块地址,则检查此消息块的完整性。如果未指定任何地址,则检查所有活动消息块的完整性。 此 dcmd 可生成所检测到的任何无效消息块状态的输出。

address ::queue [-v] [-f flag] [-F flag] [-s syncq]

过滤并显示指定的 queue_t 数据结构。 如果没有任何选项,则显示 queue_t 的各种属性。 如果存在 -v 选项,则更详细地解码队列标志。 如果存在 -f-F-m 选项,则仅当队列与这些选项的参数所定义的条件匹配时才显示该队列;通过此方式,dcmd 可用作管道输入的过滤器。 -f 选项表示指定的标志(<sys/stream.h> 中的其中一个 Q 标志名称)必须存在于队列标志中。 -F 选项表示队列标志中决不能存在指定的标志。-m 选项表示与队列关联的模块名称必须与指定的 modname 匹配。-s 选项表示与队列关联的 syncq_t 必须与指定的 syncq_t 地址匹配。

address ::q2syncq

在指定 queue_t 的地址的情况下,列显对应的 syncq_t 数据结构的地址。

address ::q2otherq

在指定 queue_t 的地址的情况下,列显对等的读取或写入队列结构的地址。

address ::q2rdq

在指定 queue_t 的地址的情况下,列显对应的读取队列的地址。

address ::q2wrq

在指定 queue_t 的地址的情况下,列显对应的写入队列的地址。

[ address ] ::stream

stdata_t 结构的地址表示 STREAM 头的情况下,显示内核 STREAM 数据结构的图像。 将会显示每个模块的读取和写入队列指针、字节计数以及标志,在某些情况下,还会在页边距中显示特定队列的其他信息。

address ::syncq [-v] [-f flag] [-F flag] [-t type] [-T type]

过滤并显示指定的 syncq_t 数据结构。 如果没有任何选项,则显示 syncq_t 的各种属性。 如果存在 -v 选项,则更详细地解码 syncq 标志。 如果存在 -f-F-t-T 选项,则仅当 syncq 与这些选项的参数所定义的条件匹配时才显示它;通过这种方式,dcmd 可用作管道输入的过滤器。-f 选项表示指定的标志(<sys/strsubr.h> 中的其中一个 SQ_ 标志名称)必须存在于 syncq 标志中。-F 选项表示 syncq 标志中决不能存在指定的标志。 -t 选项表示指定的类型(<sys/strsubr.h> 中的其中一个 SQ_CISQ_CO 类型名称)必须存在于 syncq 类型位中。 -T 选项表示 syncq 类型位中决不能存在指定的类型。

address ::syncq2q

在指定 syncq_t 的地址的情况下,列显对应的 queue_t 数据结构的地址。

Walker

b_cont

在指定 mblk_t 的地址的情况下,通过跟踪 b_cont 指针迭代关联的消息结构集。b_cont 指针用于将指定的消息块链接到为同一消息的延续的下一个关联消息块。msgb(9S) 中对消息块进行了更详细的介绍

b_next

在指定 mblk_t 的地址的情况下,通过跟踪 b_next 指针迭代关联的消息结构集。b_next 指针用于将指定的消息块链接到指定队列中的下一个关联消息块。msgb(9S) 中对消息块进行了更详细的介绍。

qlink

在指定 queue_t 结构的地址的情况下,使用 q_link 指针遍历相关队列的列表。 此结构在 <sys/stream.h> 中定义。

qnext

在指定 queue_t 结构的地址的情况下,使用 q_next 指针遍历相关队列的列表。 此结构在 <sys/stream.h> 中定义。

readq

在指定 stdata_t 结构的地址的情况下,遍历读面队列结构的列表。

writeq

在指定 stdata_t 结构的地址的情况下,遍历写面队列结构的列表。

联网

以下提供的 dcmd 和 walker 有助于调试核心内核联网栈协议。

dcmd

address ::mi [-p] [-d | -m]

在指定内核 MI_O 的地址的情况下,过滤并显示 MI_O 或其有效负荷。如果指定了 -p 选项,则显示 MI_O 对应的有效负荷的地址,否则显示 MI_O 本身。通过指定过滤器 -d-m,dcmd 可以过滤设备或模块 MI_O 对象。

::netstat [-av] [-f inet | inet6 | unix] [-P tcp | udp]

显示网络统计信息和活动连接。 如果存在 -a 选项,则显示所有套接字的状态。 如果存在 -v 选项,则显示更详细的输出。 如果存在 -f 选项,则仅显示与指定的地址族关联的连接。如果存在 -P 选项,则仅显示与指定协议关联的连接。

[ address ] ::sonode [-f inet | inet6 | unix | id] [-t stream | dgram | raw | id] [-p id]

过滤并显示 sonode 对象。如果未指定任何地址,则显示 AF_UNIX 套接字的列表,否则仅显示指定的 sonode。 如果存在 -f 选项,则仅输出指定族的套接字。如果存在 -t 选项,则仅输出指定类型的 sonode。如果存在 -p 选项,则仅显示指定协议的套接字。

[ address ] ::tcpb [-av] [-P v4 | v6]

过滤并显示 tcpb 对象。如果未指定任何地址,则遍历所有连接,否则仅过滤/显示指定的 tcpb。如果仅为活动连接指定 -a 过滤器,则可以使用 -P 过滤 TCP IPv4 或 IPv6 连接。tcpb dcmd 可以对 TCP 连接进行智能过滤,如果 IPv6 TCP 连接处于仍然允许 IPv4 连接的状态,则 -P 过滤器会将该连接同时视为 IPv4 和 IPv6,这与 ::netstat 所使用的方式非常相似。如果未将 dcmd 用作过滤器并且指定了 -v 选项,则 dcmd 的输出将为详细输出。

Walker

ar

此 walker 用于在指定 ar 的地址的情况下,遍历从指定 ar 到最后一个 ar 的所有 ar 对象。如果未指定任何地址,则遍历所有 ar 对象。

icmp

此 walker 用于在指定 icmp 的地址的情况下,遍历从指定 icmp 到最后一个 icmp 的所有 icmp 对象。如果未指定任何地址,则遍历所有 icmp 对象。

ill

此 walker 用于在指定接口链路层 (interface link layer, ill) 结构的地址的情况下,遍历从指定 ill 到最后一个 ill 的所有 ill 对象。如果未指定任何地址,则遍历所有 ill 对象。

ipc

此 walker 用于在指定 ipc 的地址的情况下,遍历从指定 ipc 到最后一个 ipc 的所有 ipc 对象。如果未指定任何地址,则遍历所有 ipc 对象。

mi

在指定 MI_O 的地址情况下,遍历此 MI 中的所有 MI_O。

sonode

在指定 AF_UNIX sonode 的地址的情况下,从指定的 sonode 开始遍历 AF_UNIX sonode 的关联列表。如果未指定任何地址,则此 walker 将遍历所有 AF_UNIX 套接字的列表。

tcpb

此 walker 用于在指定 tcpb 的地址的情况下,遍历从指定 tcpb 到最后一个 TCP 连接的所有 TCP 连接。如果未指定任何地址,则遍历所有 tcpb 对象。

udp

此 walker 用于在指定 udp 的地址的情况下,遍历从指定 udp 到最后一个 udp 的所有 udp 对象。如果未指定任何地址,则遍历所有 udp 对象。

文件、进程和线程

本节介绍用于对 Solaris 内核中各种基础文件、进程和线程结构进行格式设置和检查的 dcmd 和 walker。

dcmd

process ::fd fd-num

列显对应于与指定进程关联的文件描述符 fd-numfile_t 地址。 进程是使用其 proc_t 结构的虚拟地址指定的。

thread ::findstack [ command ]

列显与指定内核线程(通过其 kthread_t 结构的虚拟地址标识)关联的栈跟踪。 该 dcmd 使用几种不同的算法查找相应的栈反向跟踪。 如果指定了可选的命令字符串,则将点变量重置为最顶部栈帧的帧指针地址,并且计算指定的命令,就好像已在命令行中键入它一样。 缺省的命令字符串是 "<.$C0";即用于列显包括帧指针(但不包括参数)的栈跟踪。

::pgrep [ -no ] regexp

显示其名称与 regexp 正则表达式模式匹配的进程的进程信息。如果存在 -n 选项,则仅显示与模式匹配的最新进程。如果存在 -o 选项,则仅显示与模式匹配的最旧进程。

pid ::pid2proc

列显与指定的 PID 相对应的 proc_t 地址。 请记住 MDB 的缺省基数是十六进制的,因此使用 pgrep(1)ps(1) 获取的十进制 PID 应该使用 0t 作为前缀。

process ::pmap [-q]

列显指定的进程地址所指示的进程的内存映射。该 dcmd 使用与 pmap(1) 类似的格式显示输出。如果存在 -q 选项,则 dcmd 显示其输出的缩写形式(所需的处理时间较短)。

[ address ] ::ps [-fltTP]

列显与指定的进程或所有活动系统进程相关的信息摘要,与 ps(1) 类似。如果指定了 -f 选项,则列显完整的命令名和初始参数。如果指定了 -l 选项,则列显与每个进程关联的 LWP。 如果指定了 -t 选项,则列显与每个进程 LWP 关联的内核线程。如果指定了 -T 选项,则显示与每个进程关联的任务 ID。如果指定了 -P 选项,则显示与每个进程关联的项目 ID。

::ptree

列显进程树,其中子进程从其各自的父进程中缩进。 该 dcmd 使用与 ptree(1) 类似的格式显示输出。

address ::task

列显活动内核任务结构及其关联 ID 号和属性的列表。settaskid(2) 中对进程任务 ID 进行了更详细的介绍。

[ address ] ::thread [-bdfimps]

显示指定内核 kthread_t 结构的属性。 如果未指定 kthread_t 地址,则显示所有内核线程的属性。 dcmd 选项用于控制所显示的输出列。 如果不存在任何选项,则缺省情况下会启用 -i 选项。 如果存在 -b 选项,则显示与线程的十字转门 (turnstile) 和阻塞同步对象相关的信息。如果存在 -d 选项,则显示线程的分发程序优先级、绑定和上次分发时间。 如果存在 -f 选项,则输出中不显示状态为 TS_FREE 的线程。 如果存在 -i 选项(缺省选项),则显示线程状态、标志、优先级和中断信息。 如果存在 -m 选项,则所有其他输出选项都将合并到一行输出上。 如果存在 -p 选项,则显示线程的进程、LWP 和凭证指针。 如果存在 -s 选项,则显示线程的信号队列以及暂挂信号和保留信号的掩码。

vnode ::whereopen

在指定 vnode_t 地址的情况下,列显当前在其文件表中打开了此 vnode 的所有进程的 proc_t 地址。

Walker

file

在将 proc_t 结构的地址作为起点的情况下,迭代与指定进程关联的打开文件集(file_t 结构)。 file_t 结构在 <sys/file.h> 中定义。

proc

迭代活动进程 (proc_t) 结构。 此结构在 <sys/proc.h> 中定义。

任务

在指定任务指针的情况下,迭代作为指定任务成员的进程的 proc_t 结构列表。

thread

迭代内核线程 (kthread_t) 结构集。 如果调用了全局遍历,则 walker 将返回所有内核线程。如果使用 proc_t 地址作为起点来调用局部遍历,则将返回与指定进程关联的线程集。kthread_t 结构在 <sys/thread.h> 中定义。

同步元语

本节介绍用于检查特定的内核同步元语的 dcmd 和 walker。 每个元语的语义在手册页对应的 (9f) 部分中讨论。

dcmd

rwlock ::rwlock

在指定读取器-写入器锁的地址(请参见 rwlock(9F))的情况下,显示锁的当前状态和等待线程的列表。

address ::sobj2ts

将同步对象的地址转换为对应的十字转门 (turnstile) 地址,并列显该十字转门 (turnstile) 地址。

[ address ] ::turnstile

显示指定的 turnstile_t 的属性。如果未指定 turnstile_t 地址,则 dcmd 显示所有十字转门 (turnstile) 的属性。

[ address ] ::wchaninfo [-v]

在指定条件变量(请参见 condvar(9F))或信号(请参见 semaphore(9F))的地址的情况下,显示当前等待此对象的线程的数量。 如果未指定任何显式地址,则显示所有包含等待线程的对象。 如果指定了 -v 选项,则显示在每个对象上阻塞的线程的列表。

Walker

blocked

在指定同步对象(如 mutex(9F)rwlock(9F))的地址的情况下,迭代阻塞的内核线程的列表。

wchan

在指定条件变量(请参见 condvar(9F))或信号(请参见 semaphore(9F))的地址的情况下,迭代阻塞的内核线程的列表。

循环

循环子系统是一种底层内核子系统,用于为其他内核服务和编程接口提供高精度、按 CPU 间隔计时器功能。

dcmd

::cycinfo [-vV]

按每个 CPU 的 CPU 状态显示循环子系统。如果存在 -v 选项,则显示更显示的内容。如果存在 -V 选项,则显示比使用 -v 时更详细的内容。

address ::cyclic

对指定地址上的 cyclic_t 进行格式设置和显示。

::cyccover

显示循环子系统代码的适用范围信息。 此信息仅在 DEBUG 内核中可用。

::cyctrace

显示循环子系统的跟踪信息。 此信息仅在 DEBUG 内核中可用。

Walker

cyccpu

迭代每个 CPU 的 cyc_cpu_t 结构。 此结构在 <sys/cyclic_impl.h> 中定义。

cyctrace

迭代循环跟踪缓冲区结构。 此信息仅在 DEBUG 内核中可用。

任务队列

任务队列子系统可为内核中的各种客户机提供通用的异步任务调度。

dcmd

address ::taskq_entry

列显指定结构 taskq_entry 的内容。

Walker

taskq_entry

在指定 taskq 结构的地址的情况下,迭代 taskq_entry 结构的列表。

错误队列

错误队列子系统可为平台特定的错误处理代码提供通用的异步错误事件处理。

dcmd

[ address ] ::errorq

显示与指定的错误队列相关的信息摘要。如果未指定任何地址,则显示与所有系统错误队列相关的信息。 将会显示每个队列的地址、名称、队列长度和数据元素大小,以及各种队列统计信息。

Walker

errorq

遍历系统错误队列的列表,并返回每个单独错误队列的地址。

errorq_data

在指定错误队列的地址的情况下,返回每个暂挂错误事件数据缓冲区的地址。

配置

本节介绍可以用于检查系统配置数据的 dcmd。

dcmd

::system

显示内核在系统初始化过程中解析文件时 system(4) 配置文件的内容。