Solaris モジューラデバッガ

データへの参照の発見

メモリー破壊の診断を行うときは、ほかのどのカーネルエンティティーが特定のポインタのコピーを保持しているかを知る必要があります。データ構造体が解放されたあとどのスレッドがこれにアクセスしたかを明らかにできるようにするために、これは重要なことです。また、特定の (有効な) データ項目の知識をどのカーネルエンティティーが共有しているかを知ることが容易になります。このためには ::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 ポインタです。