Solaris 模块调试器指南

查找数据引用

尝试诊断内存损坏问题时,应该知道其他哪些内核实体包含特定指针的副本。这一点非常重要,因为这可以表明哪个线程在被释放后访问了数据结构。 另外,还可以更轻松地了解哪些内核实体正在共享特定(有效)数据项的信息。 ::whatis::kgrep dcmd 可以用于回答这些问题。 可以对相关值应用 ::whatis

> 0x705d8640::whatis

705d8640 is 705d8640+0, allocated from streams_mblk

在本示例中,表明 0x705d8640 是指向 STREAMS mblk 结构的指针。 要查看整个分配树,请改用 ::whatis -a

> 0x705d8640::whatis -a

705d8640 is 705d8640+0, allocated from streams_mblk

705d8640 is 705d8000+640, allocated from kmem_va_8192

705d8640 is 705d8000+640 from kmem_default vmem arena

705d8640 is 705d2000+2640 from kmem_va vmem arena

705d8640 is 705d2000+2640 from heap vmem arena

这表明分配也会在 kmem_va_8192 高速缓存(即面向 kmem_va vmem 块的 kmem 高速缓存)中进行。 它还显示了 vmem 分配的完整栈。

kmem 高速缓存和 vmem 块的完整列表通过 ::kmastat dcmd 显示。 可以使用 ::kgrep 查找包含指向此 mblk 的指针的其他内核地址。这说明了系统中内存分配的分层性质;通常,可以根据最具体 kmem 高速缓存的名称确定给定地址所引用的对象类型。

> 0x705d8640::kgrep

400a3720

70580d24

7069d7f0

706a37ec

706add34

并通过再次应用 ::whatis 对其进行检查:

> 400a3720::whatis

400a3720 is in thread 7095b240's stack



> 706add34::whatis

706add34 is 706add20+14, allocated from streams_dblk_120

在这里一个指针位于已知内核线程的栈上,另一个指针 mblk 位于对应的 STREAMS dblk 结构的内部。