この節では、Solaris カーネルメモリーアロケータによって識別される問題のデバッグ、およびメモリーとメモリー使用率の検査に使用される dcmd と walker について説明します。ここで説明する dcmd と walker については、第 6 章「カーネルメモリーアロケータを使用するデバッギング」でさらに詳細に説明します。
カーネルスレッドのアドレスを指定して、そのスレッドが割り当てたメモリーを新しく割り当てた順番に一覧表示します。
指定された bufctl address に関する bufctl 情報の要約を出力します。1 つまたは複数のオプションが指定されている場合は、オプション引数によって定義される条件に一致する bufctl 情報だけが出力されます。このようにして、dcmd を、パイプラインからの入力のフィルタとして使用することができます。-a オプションは、buctl の対応するバッファアドレスが指定されたアドレスと等しくなるように指定します。-c オプションは、指定された呼び出し元のプログラムカウント値が bufctl の保存されているスタックトレースの中に存在するように指定します。-e オプションは、bufctl の時刻表示が、指定された最も早い時刻表示よりも遅い時刻になるように指定します。-l オプションは、bufctl の時刻表示が、指定された最も遅い時刻表示よりも早い時刻になるように指定します。-t オプションは、bufctl のスレッドポインタが、指定されたスレッドアドレスと等しくなければならないことを指示します。
::findleaks dcmd は、フルセットの kmem デバッギング機能が有効になっている場合に、カーネルクラッシュダンプ時に効率的にメモリーリークを検出します。::findleaks の最初の実行では、ダンプを処理してメモリーリークを探します。この処理には数分かかる場合があります。次に、割り当てスタックトレース別にリークがまとめられます。findleaks レポートには、識別されたメモリーリークごとに bufctl アドレスと先頭のスタックフレームが表示されます。
-v オプションが指定されている場合には、この dcmd は実行の際により詳細なメッセージを出力します。dcmd の前に明示的にアドレスが指定されている場合には、レポートがフィルタリングされ、割り当てスタックトレースに指定された関数アドレスが含まれているリークだけが表示されます。
カーネルスレッドのアドレスを指定して、そのスレッドが解放したメモリーを新しく解放した順番に一覧表示します。
カーネルアドレス空間の中で、指定されたポインタサイズ値を含んでいるポインタ整列アドレスを検索します。次に、一致する値を含んでいるアドレスのリストを出力します。MDB の組み込み検索演算子とは異なり、::kgrep はカーネルアドレス空間のすべてのセグメントを検索し、不連続セグメント境界にまたがって検索します。大きなカーネルでは、::kgrep は実行にかなりの時間がかかる場合があります。
カーネルメモリーアロケータトランザクションログの中のイベントを表示します。イベントは、新しく発生した時間の順番に、最新のイベントから先に表示されます。::kmalog は、イベントごとに、「T-」表示による最新のイベントを基準にした相対時間 (たとえば、T-0.000151879)、bufctl、バッファアドレス、kmem キャッシュ名、およびイベント発生時刻におけるスタックトレースを表示します。引数を指定しないと、::kmalog は kmem トランザクションログを表示しますが、このログは kmem_flags で KMF_AUDIT が設定されている場合にだけ存在します。::kmalog fail は、割り当て障害ログを表示します。このログは必ず存在します。これは、割り当て障害に正しく対処できないドライバのデバッグを行う場合に役立ちます。::kmalog slab は、スラブ作成ログを表示します。このログは必ず存在します。::kmalog slab は、メモリーリークの検索を行う場合に役立ちます。
カーネルメモリーアロケータキャッシュおよび仮想記憶領域のリストと該当する統計を表示します。
カーネルメモリーアロケータの現在のメモリーの割り当てが中程度あるいは多いユーザーに関する情報を出力します。この出力は、一意的なスタックトレースごとに 1 つのエントリで構成され、そのスタックトレースを使用して作成された合計メモリー量と割り当ての数が示されます。この dcmd を使用するには、kmem_flags で KMF_AUDIT フラグが設定されている必要があります。
1 つまたは複数のキャッシュ名 (たとえば、kmem_alloc_256) が指定されている場合、メモリー使用率の走査はそれらのキャッシュでだけ行われます。デフォルトでは、すべてのキャッシュが含まれます。-e オプションを指定すると、割り当て量の少ないユーザーが含まれます。割り当ての少ないユーザーとは、同じスタックトレースの合計メモリーが 1024 バイト未満または割り当て数 10 未満であるような割り当てのことです。-f オプションを指定すると、個々の割り当てのスタックトレースが出力されます。
指定されたアドレスに格納されている kmem_cache 構造体、またはアクティブ kmem_cache 構造体の完全なセットをフォーマットし、表示します。
kmem トランザクションログの完全なセットを、発生時間の新しい順にソートして表示します。この dcmd は、::kmalog より簡単な表形式で出力します。
指定されたアドレスに格納されている kmem_cache 構造体、またはアクティブ kmem_cache 構造体の完全なセットの完全性を検証します。明示的にキャッシュアドレスが指定されている場合、この dcmd はエラーに関するより冗長な情報を表示します。明示的に指定されていない場合は、要約レポートを表示します。::kmem_verify dcmd については、「カーネルメモリーキャッシュ」で詳しく説明します。
指定されたアドレスに格納されている vmem 構造体、またはアクティブ vmem 構造体の完全なセットをフォーマットし、表示します。この構造体は、<sys/vmem_impl.h> で定義されます。
指定されたアドレスに格納されている vmem_seg 構造体をフォーマットし、表示します。この構造体は、<sys/vmem_impl.h> で定義されます。
指定されたアドレスに関する情報をレポートします。とくに、::whatis は、そのアドレスが kmem によって管理されているバッファへのポインタまたはスレッドスタックのような別のタイプの特殊メモリー領域へのポインタかどうかを判断し、検出結果をレポートします。-a オプションを指定すると、dcmd は照会に最初に一致するものだけでなく、すべての一致をレポートします。-b オプションを指定すると、dcmd はそのアドレスが既知の kmem bufctl によって参照されているかどうかも判断します。-v オプションを指定すると、この dcmd は、種々のカーネルデータ構造体を検索する際に進行状況をレポートします。
開始点として kthread_t 構造体のアドレスを指定して、このカーネルスレッドによって行われたメモリー割り当てに対応する bufctl 構造体のセットに対して繰り返します。
開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連して割り当てられた bufctl のセットに対して繰り返します。
開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連する未使用 bufctl のセットに対して繰り返します。
開始点として kthread_t 構造体のアドレスを指定して、このカーネルスレッドによって行われたメモリー割り当て解除に対応する bufctl 構造体のセットに対して繰り返します。
開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連する未使用バッファのセットに対して繰り返します。
開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連して割り当てられたバッファのセットに対して繰り返します。
kmem_cache_t 構造体のアクティブセットに対して繰り返します。この構造体は、<sys/kmem_impl.h> で定義されます。
開始点として kmem_cache_t 構造体のアドレスを指定して、このキャッシュに関連する CPU ごとの kmem_cpu_cache_t 構造体に対して繰り返します。この構造体は、<sys/kmem_impl.h> で定義されます。
開始点として kmem_cache_t 構造体のアドレスを指定して、関連する kmem_slab_t 構造体のセットに対して繰り返します。この構造体は、<sys/kmem_impl.h> で定義されます。
kmem アロケータトランザクションログに格納されている bufctl のセットに対して繰り返します。
MDBファイルシステムのデバッギングサポートには、vnode ポインタを対応するファイルシステムのパス名に変換する組み込み機能が含まれています。この変換は、Directory Name Lookup Cache (DNLC) を使用して行われます。その理由は、キャッシュはすべてのアクティブ vnode を保持しているわけではないので、一部の vnode はパス名に変換することができず、名前の代わりに「??」が表示されるからです。
マウントされているファイルシステムのテーブルを表示します。これには、vfs_t アドレス、ops ベクトル、および各ファイルシステムのマウントポイントが含まれます。
ロックマネージャによって登録されたアクティブネットワークロックを持つ vnodes のテーブルを表示します。各 vnode に対応するパス名が示されます。
指定された vnode アドレスに対応するパス名を表示します。-v オプションを指定すると、この dcmd はより詳細な表示を出力します。これには、各中間パスコンポーネントの vnode ポインタが含まれます。
アクティブブロック I/O 転送構造体 (buf_t 構造体) のセットに対して繰り返します。buf 構造体は、<sys/buf.h> で定義されます。詳細については、buf(9S) のマニュアルページを参照してください。
この節では、カーネル仮想記憶サブシステムのデバッギングサポートについて説明します。
カーネルの segmap アドレス空間セグメント内の指定されたアドレスに対応する smap 構造体アドレスを出力します。
as_t アドレス as に対応するプロセスの proc_t アドレスを表示します。
指定されたアドレス空間セグメント (seg_t アドレス) をフォーマットし、表示します。
指定された vnode_t アドレスおよびオフセットに対応する smap 構造体アドレスを出力します。
開始点として anon_map 構造体のアドレスを指定して、関連する anon 構造体のセットに対して繰り返します。anon マップ実装は、<vm/anon.h> で定義されます。
開始点として as_t 構造体のアドレスを指定して、指定されたアドレス空間に関連するアドレス空間セグメント (seg 構造体) のセットに対して繰り返します。seg 構造体は、<vm/seg.h> で定義されます。
この節では、CPU 構造体とカーネルディスパッチャの状態を調べる機能について説明します。
コールアウトテーブルを表示します。各コールアウトの関数、引数、有効期限が表示されます。
スケジューリングクラステーブルを表示します。
各 CPU 上で現在実行されているスレッドのテーブルを表示します。dcmd 名の前にオプションの CPU ID 番号を指定すると、指定された CPU に関する情報だけが表示されます。-v オプションを指定すると、::cpuinfo は、各 CPU 上で実行されるまで待機している実行可能スレッドとアクティブ割り込みスレッドも表示します。
カーネル CPU 構造体のセットに対して繰り返します。cpu_t 構造体は、<sys/cpuvar.h> で定義されます。
この節では、カーネル開発者やサードパーティのデバイスドライバ開発者にとって有用な dcmd と walker について説明します。
名前を指定されたドライバについてすべてのインスタンスのリストを表示します。出力は、インスタンスごとに 1 つのエントリからなり、先頭が dev_info 構造へのポインタ ($<devinfo または ::devinfo で表示可能)、続いてドライバ名、インスタンス番号、そのインスタンスに関連付けられたドライバプロパティおよびシステムプロパティが表示されます。
devinfo ノードに関連付けられたシステムプロパティおよびドライバプロパティを出力します。-q オプションを指定すると、そのデバイスノードのクイックサマリだけを表示します。
カーネルの devnames テーブルと dn_head ポインタを表示します。このポインタは、ドライバインスタンスリストを指しています。-v フラグを指定すると、devnames テーブルの各エントリに格納されている追加情報が表示されます。
devinfo で指定されたデバイスノードからカーネルデバイスツリーを表示します。devinfo を指定しないと、デフォルトでルートからデバイスツリーが表示されます。-c オプションを指定すると、指定されたデバイスノードの子だけが表示されます。-p オプションを指定すると、指定されたデバイスノードの祖先だけが表示されます。-v オプションを指定すると、各ノードに関連付けられたプロパティが表示されます。
指定されたメジャー番号に該当するドライバ名を表示します。メジャー番号は、dcmd の前に式の形で、またはコマンド行引数として指定できます。
指定された modctl アドレスに対応するすべてのデバイスノードを出力します。
デバイスドライバ名を指定すると、そのメジャー番号を表示します。
softstate 状態ポインタ (ddi_soft_state_init(9F) のマニュアルページを参照) とデバイスインスタンス番号を指定すると、そのインスタンスのソフトの状態を表示します。
最初に、指定された devinfo の親に対して繰り返し、それらを最下位から世代順に返します。次に、指定された devinfo 自体を返します。その次に、指定された devinfo の子どもに対して、世代順に最上位から最下位まで繰り返します。dev_info 構造体は、<sys/ddi_impldefs.h> で定義されます。
最初に、指定された devinfo を返し、次に、指定された devinfo の子どもに対して、世代順に最上位から最下位まで繰り返します。dev_info 構造体は、<sys/ddi_impldefs.h> で定義されます。
指定された devinfo の親に対して、世代順に最上位から最下位まで繰り返し、次に、指定された devinfo を返します。dev_info 構造体は、<sys/ddi_impldefs.h> で定義されます。
指定された devinfo の兄弟ウィジェットに対して繰り返します。dev_info 構造体は、<sys/ddi_impldefs.h> で定義されます。
devnames 配列のエントリに対して繰り返します。この構造体は、<sys/autoconf.h> で定義されます。
この節では、カーネル開発者やサードパーティの STREAMS モジュールやドライバの開発者にとって有用な dcmd と walker について説明します。
指定された queue_t データ構造体をフィルタリングし表示します。オプションを指定しないと、queue_t の種々のプロパティが表示されます。-v オプションを指定すると、待ち行列フラグが詳細に復号化されます。-f、-F、または -m オプションを指定すると、これらのオプションの引数によって定義される条件に一致した場合にだけ、待ち行列が表示されます。したがって、この dcmd をパイプラインからの入力のフィルタとして使用できます。-f オプションは、指定したフラグ (<sys/stream.h> の Q フラグ名の 1 つ) が待ち行列フラグの中に存在しなければならないことを指示します。-F オプションは、指定したフラグが待ち行列フラグの中に存在してはならないことを指示します。-m オプションは、待ち行列に関連付けられたモジュール名が指定された modname に一致しなければならないことを指示します。
queue_t のアドレスを指定して、対応する syncq_t データ構造体のアドレスを出力します。
queue_t のアドレスを指定して、ピアな読み取りまたは書き込み待ち行列構造体のアドレスを出力します。
queue_t のアドレスを指定して、対応する読み取り待ち行列のアドレスを出力します。
queue_t のアドレスを指定して、対応する書き込み待ち行列のアドレスを出力します。
STREAM ヘッドを表す stdata_t 構造体のアドレスを指定して、カーネル STREAM データ構造体の画像を表示します。読み取りおよび書き込み待ち行列ポインタ、バイト数、各モジュールのフラグが示され、さらに、余白に指定された待ち行列に関する追加情報が示される場合もあります。
指定された syncq_t データ構造体をフィルタリングし表示します。オプションを指定しないと、syncq_t の種々のプロパティが表示されます。-v オプションを指定すると、syncq フラグが詳細に復号化されます。-f、-F、-t、または -T オプションを指定すると、これらのオプションの引数によって定義される条件に一致する場合にだけ、syncq が表示されます。したがって、この dcmd をパイプラインの入力のフィルタとして使用できます。-f オプションは、指定したフラグ (<sys/strsubr.h> の SQ_ フラグ名の 1 つ) が syncq フラグの中に存在しなければならないことを指示します。-F オプションは、指定したフラグが syncq フラグの中に存在してはならないことを指示します。-t オプションは、指定したタイプ (<sys/strsubr.h> の SQ_CI または SQ_CO タイプ名の 1 つ) が syncq タイプビットの中に存在しなければならないことを指示します。-T オプションは、指定したタイプが syncq タイプビットの中に存在してはならないことを指示します。
syncq_t のアドレスを指定して、対応する queue_t データ構造体のアドレスを出力します。
queue_t 構造体のアドレスを指定して、q_link ポインタを使用して関連する待ち行列のリストを調べます。この構造体は、<sys/stream.h> で定義されます。
queue_t 構造体のアドレスを指定して、q_next ポインタを使用して関連する待ち行列のリストを調べます。この構造体は、<sys/stream.h> で定義されます。
stdata_t 構造体のアドレスを指定して、読み取り側待ち行列構造体のリストを調べます。
stdata_t 構造体のアドレスを指定して、書き込み側待ち行列構造体のリストを調べます。
この節では、Solaris カーネルの種々の基本的ファイル、プロセス、およびスレッド構造体をフォーマットし調べるために使用される dcmd と walker について説明します。
指定されたプロセスに関連付けられたファイル記述子 fd-num に対応する file_t アドレスを出力します。このプロセスは、proc_t 構造体の仮想アドレスによって指定されます。
指定されたカーネルスレッドに関連付けられたスタックトレースを出力します。このスレッドは、kthread_t 構造体の仮想アドレスによって識別されます。この dcmd は、複数の異なるアルゴリズムを使用して該当するスタックバックトレースを見つけます。オプションのコマンド文字列を指定すると、ドット変数はスタックフレームの最先頭のフレームポインタアドレスにリセットされ、指定されたコマンドはコマンド行に入力された場合と同じように評価されます。デフォルトのコマンド文字列は、<.$C0 です。すなわち、フレームポインタを含め、引数を付けずにスタックトレースを出力します。
指定されたプロセス ID に対応する proc_t アドレスを出力します。MDB のデフォルトは 16 進数であることを思い出してください。したがって、pgrep(1) または ps(1) を使用して取得した 10 進数のプロセス ID には接頭辞 0t を付ける必要があります。
指定されたプロセスアドレスが指示するプロセスのメモリーマップを出力します。この dcmd は、pmap(1) に似た書式を使用して出力を表示します。
指定されたプロセスまたはすべてのアクティブシステムプロセスに関連する情報の要約を出力します。ps(1) に似ています。-f オプションを指定すると、完全なコマンド名と初期引数が出力されます。-l オプションを指定すると、各プロセスに関連付けられた LWP が出力されます。-t オプションを指定すると、各プロセス LWP に関連付けられたカーネルスレッドが出力されます。
それぞれの親プロセスから派生した子プロセスを含むプロセスツリーを出力します。この dcmd は、ptree(1) に似た書式を使用して出力を表示します。
vnode_t アドレスを指定して、現在ファイルテーブルの中で開かれている、この vnode を持つすべてのプロセスの proc_t アドレスを出力します。
開始点としてproc_t 構造体のアドレスを指定して、指定されたプロセスに関連付けられた開かれているファイル (file_t 構造体) のセットに対して繰り返します。file_t 構造体は、<sys/file.h> で定義されます。
アクティブプロセス (proc_t) 構造体に対して繰り返します。この構造体は、<sys/proc.h> で定義されます。
カーネルスレッド (kthread_t) 構造体のセットに対して繰り返します。グローバル walk が起動されると、すべてのカーネルスレッドがこの walker によって返されます。開始点として proc_t アドレスを使用してローカル walk が起動されると、指定されたプロセスに関連付けられたスレッドのセットが返されます。kthread_t 構造体は、<sys/thread.h> で定義されます。
この節では、特定のカーネル同期プリミティブを調べるために使用される dcmd と walker について説明します。各プリミティブの意味については、『man pages section 9F: DDI and DKI Kernel Functions』を参照してください。
読み取り・書き込みロック (rwlock(9F) のマニュアルページを参照) のアドレスを指定して、現在のロックの状態と待機しているスレッドのリストを表示します。
条件変数 (condvar(9F) のマニュアルページを参照) またはセマフォ (semaphore(9F) のマニュアルページを参照) のアドレスを指定して、このオブジェクトでの現在の待機数を表示します。明示的にアドレスを指定しないと、待機しているスレッドがあるすべてのオブジェクトが表示されます。-v オプションを指定すると、オブジェクトで現在ブロックされているスレッドのリストが表示されます。
同期オブジェクト (たとえば、mutex(9F) や rwlock(9F)) のアドレスを指定して、ブロックされているカーネルスレッドのリストに対して繰り返します。
条件変数 (condvar(9F) のマニュアルページを参照) またはセマフォ (semaphore(9F) のマニュアルページを参照) のアドレスを指定して、ブロックされているカーネルスレッドのリストに対して繰り返します。
cyclic サブシステムは下位レベルのカーネルサブシステムで、高解像度、他のカーネルサービスに対する各 CPU インターバルタイマー機能、およびプログラミングインタフェースを提供します。
CPU ごとに cyclic サブシステムの各 CPU の状態を表示します。-v オプションを指定すると、より詳細な表示が示されます。-V オプションを指定すると、-v よりもさらに詳細な表示が示されます。
指定されたアドレスの cyclic_t をフォーマットし、表示します。
cyclic サブシステムのコードカバレージ情報を表示します。この情報は、DEBUG カーネルだけで使用可能です。
cyclic サブシステムのトレース情報を表示します。この情報は、DEBUG カーネルだけで使用可能です。
各 CPU の cyc_cpu_t 構造体に対して繰り返します。この構造体は、<sys/cyclic_impl.h> で定義されます。
cyclic トレースバッファ構造体に対して繰り返します。この情報は、DEBUG カーネルだけで使用可能です。