Solaris 内核在可用 kmdb 或 mdb 检查的结构中提供数据类型信息。
kmdb 和 mdb dcmd 只能用于包含设计用于 mdb 的压缩符号调试信息的对象。此信息当前只能用于某些 Solaris 内核模块。必须安装 SUNWzlib 软件包,才能处理符号调试信息。
以下示例说明如何显示 scsi_pkt 结构中的数据。
> 7079ceb0::print -t 'struct scsi_pkt' { opaque_t pkt_ha_private = 0x7079ce20 struct scsi_address pkt_address = { struct scsi_hba_tran *a_hba_tran = 0x70175e68 ushort_t a_target = 0x6 uchar_t a_lun = 0 uchar_t a_sublun = 0 } opaque_t pkt_private = 0x708db4d0 int (*)() *pkt_comp = sd_intr uint_t pkt_flags = 0 int pkt_time = 0x78 uchar_t *pkt_scbp = 0x7079ce74 uchar_t *pkt_cdbp = 0x7079ce64 ssize_t pkt_resid = 0 uint_t pkt_state = 0x37 uint_t pkt_statistics = 0 uchar_t pkt_reason = 0 } |
数据结构的大小在调试中很有用。使用 ::sizeof dcmd 可获取结构的大小,如以下示例所示。
> ::sizeof struct scsi_pkt sizeof (struct scsi_pkt) = 0x58 |
结构中特定成员的地址在调试中也很有用。有几种方法可用来确定成员的地址。
使用 ::offsetof dcmd 可以获取结构中给定成员的偏移,如以下示例所示。
> ::offsetof struct scsi_pkt pkt_state offsetof (struct pkt_state) = 0x48 |
使用带 -a 选项的 ::print dcmd 可以显示结构中所有成员的地址,如以下示例所示。
> ::print -a struct scsi_pkt { 0 pkt_ha_private 8 pkt_address { ... } 18 pkt_private ... } |
如果结合使用 ::print 和 -a 选项来指定地址,则会显示每个成员的绝对地址。
> 10000000::print -a struct scsi_pkt { 10000000 pkt_ha_private 10000008 pkt_address { ... } 10000018 pkt_private ... } |
使用 ::print、::sizeof 和 ::offsetof dcmd,可在驱动程序与 Solaris 内核交互时调试问题。
通过此功能可访问原始内核数据结构。您可以检查任何结构,无论该结构是否显示为 DDI 的一部分。因此,应避免依赖于未显式构成 DDI 的任何数据结构。
这些 dcmd 只能用于包含设计用于 mdb 的压缩符号调试信息的对象。符号调试信息当前只能用于某些 Solaris 内核模块。必须安装 SUNWzlib(32 位)或 SUNWzlibx(64 位)解压缩软件,才能处理符号调试信息。无论是否包含 SUNWzlib 或 SUNWzlibx 软件包,kmdb 调试程序均可处理符号类型数据。