Solaris モジューラデバッガ

カーネルメモリーアロケータ

この節では、Solaris カーネルメモリーアロケータによって識別される問題のデバッグ、およびメモリーとメモリー使用率の検査に使用される dcmd と walker について説明します。ここで説明する dcmd と walker については、第 6 章「カーネルメモリーアロケータを使用するデバッギング」でさらに詳細に説明します。

dcmd

thread ::allocdby

カーネルスレッドのアドレスを指定して、そのスレッドが割り当てたメモリーを新しく割り当てた順番に一覧表示します。

bufctl ::bufctl [-a address] [-c caller] [-e earliest] [-l latest] [-t thread]

指定された bufctl address に関する bufctl 情報の要約を出力します。1 つまたは複数のオプションが指定されている場合は、オプション引数によって定義される条件に一致する bufctl 情報だけが出力されます。このようにして、dcmd を、パイプラインからの入力のフィルタとして使用することができます。-a オプションは、buctl の対応するバッファアドレスが指定されたアドレスと等しくなるように指定します。-c オプションは、指定された呼び出し元のプログラムカウント値が bufctl の保存されているスタックトレースの中に存在するように指定します。-e オプションは、bufctl の時刻表示が、指定された最も早い時刻表示よりも遅い時刻になるように指定します。-l オプションは、bufctl の時刻表示が、指定された最も遅い時刻表示よりも早い時刻になるように指定します。-t オプションは、bufctl のスレッドポインタが、指定されたスレッドアドレスと等しくなければならないことを指示します。

[ address ] ::findleaks [-v]

::findleaks dcmd は、フルセットの kmem デバッギング機能が有効になっている場合に、カーネルクラッシュダンプ時に効率的にメモリーリークを検出します。::findleaks の最初の実行では、ダンプを処理してメモリーリークを探します。この処理には数分かかる場合があります。次に、割り当てスタックトレース別にリークがまとめられます。findleaks レポートには、識別されたメモリーリークごとに bufctl アドレスと先頭のスタックフレームが表示されます。

-v オプションが指定されている場合には、この dcmd は実行の際により詳細なメッセージを出力します。dcmd の前に明示的にアドレスが指定されている場合には、レポートがフィルタリングされ、割り当てスタックトレースに指定された関数アドレスが含まれているリークだけが表示されます。

thread ::freedby

カーネルスレッドのアドレスを指定して、そのスレッドが解放したメモリーを新しく解放した順番に一覧表示します。

value ::kgrep

カーネルアドレス空間の中で、指定されたポインタサイズ値を含んでいるポインタ整列アドレスを検索します。次に、一致する値を含んでいるアドレスのリストを出力します。MDB の組み込み検索演算子とは異なり、::kgrep はカーネルアドレス空間のすべてのセグメントを検索し、不連続セグメント境界にまたがって検索します。大きなカーネルでは、::kgrep は実行にかなりの時間がかかる場合があります。

::kmalog [ slab | fail ]

カーネルメモリーアロケータトランザクションログの中のイベントを表示します。イベントは、新しく発生した時間の順番に、最新のイベントから先に表示されます。::kmalog は、イベントごとに、「T-」表示による最新のイベントを基準にした相対時間 (たとえば、T-0.000151879)、bufctl、バッファアドレス、kmem キャッシュ名、およびイベント発生時刻におけるスタックトレースを表示します。引数を指定しないと、::kmalog は kmem トランザクションログを表示しますが、このログは kmem_flagsKMF_AUDIT が設定されている場合にだけ存在します。::kmalog fail は、割り当て障害ログを表示します。このログは必ず存在します。これは、割り当て障害に正しく対処できないドライバのデバッグを行う場合に役立ちます。::kmalog slab は、スラブ作成ログを表示します。このログは必ず存在します。::kmalog slab は、メモリーリークの検索を行う場合に役立ちます。

::kmastat

カーネルメモリーアロケータキャッシュおよび仮想記憶領域のリストと該当する統計を表示します。

::kmausers [-ef] [cache ...]

カーネルメモリーアロケータの現在のメモリーの割り当てが中程度あるいは多いユーザーに関する情報を出力します。この出力は、一意的なスタックトレースごとに 1 つのエントリで構成され、そのスタックトレースを使用して作成された合計メモリー量と割り当ての数が示されます。この dcmd を使用するには、kmem_flagsKMF_AUDIT フラグが設定されている必要があります。

1 つまたは複数のキャッシュ名 (たとえば、kmem_alloc_256) が指定されている場合、メモリー使用率の走査はそれらのキャッシュでだけ行われます。デフォルトでは、すべてのキャッシュが含まれます。-e オプションを指定すると、割り当て量の少ないユーザーが含まれます。割り当ての少ないユーザーとは、同じスタックトレースの合計メモリーが 1024 バイト未満または割り当て数 10 未満であるような割り当てのことです。-f オプションを指定すると、個々の割り当てのスタックトレースが出力されます。

[ address ] ::kmem_cache

指定されたアドレスに格納されている kmem_cache 構造体、またはアクティブ kmem_cache 構造体の完全なセットをフォーマットし、表示します。

::kmem_log

kmem トランザクションログの完全なセットを、発生時間の新しい順にソートして表示します。この dcmd は、::kmalog より簡単な表形式で出力します。

[ address ] ::kmem_verify

指定されたアドレスに格納されている kmem_cache 構造体、またはアクティブ kmem_cache 構造体の完全なセットの完全性を検証します。明示的にキャッシュアドレスが指定されている場合、この dcmd はエラーに関するより冗長な情報を表示します。明示的に指定されていない場合は、要約レポートを表示します。::kmem_verify dcmd については、「カーネルメモリーキャッシュ」で詳しく説明します。

[ address ] ::vmem

指定されたアドレスに格納されている vmem 構造体、またはアクティブ vmem 構造体の完全なセットをフォーマットし、表示します。この構造体は、<sys/vmem_impl.h> で定義されます。

address ::vmem_seg

指定されたアドレスに格納されている vmem_seg 構造体をフォーマットし、表示します。この構造体は、<sys/vmem_impl.h> で定義されます。

address ::whatis [-abv]

指定されたアドレスに関する情報をレポートします。とくに、::whatis は、そのアドレスが kmem によって管理されているバッファへのポインタまたはスレッドスタックのような別のタイプの特殊メモリー領域へのポインタかどうかを判断し、検出結果をレポートします。-a オプションを指定すると、dcmd は照会に最初に一致するものだけでなく、すべての一致をレポートします。-b オプションを指定すると、dcmd はそのアドレスが既知の kmem bufctl によって参照されているかどうかも判断します。-v オプションを指定すると、この dcmd は、種々のカーネルデータ構造体を検索する際に進行状況をレポートします。

walker

allocdby

開始点として kthread_t 構造体のアドレスを指定して、このカーネルスレッドによって行われたメモリー割り当てに対応する bufctl 構造体のセットに対して繰り返します。

bufctl

開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連して割り当てられた bufctl のセットに対して繰り返します。

freectl

開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連する未使用 bufctl のセットに対して繰り返します。

freedby

開始点として kthread_t 構造体のアドレスを指定して、このカーネルスレッドによって行われたメモリー割り当て解除に対応する bufctl 構造体のセットに対して繰り返します。

freemem

開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連する未使用バッファのセットに対して繰り返します。

kmem

開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連して割り当てられたバッファのセットに対して繰り返します。

kmem_cache

kmem_cache_t 構造体のアクティブセットに対して繰り返します。この構造体は、<sys/kmem_impl.h> で定義されます。

kmem_cpu_cache

開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連する CPU ごとの kmem_cpu_cache_t 構造体に対して繰り返します。この構造体は、<sys/kmem_impl.h> で定義されます。

kmem_slab

開始点として kmem_cache_t 構造体のアドレスを指定して、関連する kmem_slab_t 構造体のセットに対して繰り返します。この構造体は、<sys/kmem_impl.h> で定義されます。

kmem_log

kmem アロケータトランザクションログに格納されている bufctl のセットに対して繰り返します。