メモリー破壊の診断を行うときは、ほかのどのカーネルエンティティーが特定のポインタのコピーを保持しているかを知る必要があります。データ構造体が解放されたあとどのスレッドがこれにアクセスしたかを明らかにできるようにするために、これは重要なことです。また、特定の (有効な) データ項目の知識をどのカーネルエンティティーが共有しているかを知ることが容易になります。このためには ::whatis dcmd と ::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 vmem 領域の前の段階の kmem キャッシュである kmem_va_8192 キャッシュにも見られます。また、フルスタックの 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
1 つのポインタは既知のカーネルスレッドのスタック上にあり、もう 1 つのポインタは対応する STREAMS dblk 構造体の内部の mblk ポインタです。