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 调试程序均可处理符号类型数据。