この章では、kmdb の実行時に利用できる動作中のオペレーティングシステムカーネルの実行制御用の MDB 機能について説明します。kmdb は、特にカーネルの実行制御と動作中のカーネルのデバッグ用に作られた MDB バージョンです。kmdb を使用すると、mdb を使ってユーザープロセスを制御および監視するのと同じように、カーネルを制御および監視できます。カーネル実行制御機能には、各 CPU で実行されているカーネルスレッドを命令レベルで制御する機能が含まれているため、開発者はカーネルをステップ実行して、リアルタイムでデータ構造体を調べることができます。
mdb と kmdb は同じユーザーインタフェースを共有しています。第 6 章「実行制御」で説明している実行制御機能はすべて kmdb でも利用でき、ユーザープロセスを制御するためのコマンドセットと同じものです。カーネルの状態を調べるためのコマンド (第 3 章「言語構文」および第 5 章「組み込みコマンド」を参照) も、kmdb の使用時に利用できます。最後に、特に指定がない限り、Solaris カーネルの実装に固有のコマンド (第 8 章「カーネルデバッギングモジュール」を参照) も利用できます。この章では、kmdb に固有の残りの機能について説明します。
カーネルの起動を簡単にデバッグできるように、ブートプロセスの初期段階で、制御がカーネル実行時リンカー (krtld) からカーネルに渡る前に kmdb を読み込むことができます。 kmdb は、-k ブートフラグ、kmdb ブートファイル、または kadb ブートファイル (互換性のため) を使ってブート時に読み込むことができます。kmdb がブート時に読み込まれると、システムがそのあとリブートされるまで、デバッガを読み込み解除することはできません。ブートの初期段階では、すぐに利用できない機能がいくつかあります。特に、デバッグ用のモジュールは、カーネルモジュールサブシステムが初期化されるまで読み込まれません。プロセッサに固有の機能は、カーネルがプロセッサ識別処理を完了するまで有効になりません。
-k オプションを使ってシステムをブートすると、ブートプロセス時に kmdb が自動的に読み込まれます。-d ブートオプションを使用すると、カーネルを開始する前にデバッガのブレークポイントを要求できます。この機能は、ほかのカーネルと同様にデフォルトのカーネルでも有効です。たとえば、kmdb を使って SPARC システムをブートし、デバッガに即時エントリを要求するには、次のいずれかのコマンドを入力します。
ok boot -kd ok boot kmdb -d ok boot kadb -d |
同じ方法で x86 システムをブートするには、次のいずれかのコマンドを入力します。
Select (b)oot or (i)nterpreter: |
b -kd Select (b)oot or (i)nterpreter: |
b kmdb -d Select (b)oot or (i)nterpreter: |
b kadb -d |
kmdb を使って SPARC システムをブートし、64 ビットの代替カーネルを読み込むには、次のコマンドを入力します。
ok boot kernel. |
test/sparcv9/unix -k |
kmdb を使って x86 システムをブートし、64 ビットの代替カーネルを読み込むには、次のコマンドを入力します。
Select (b)oot or (i)nterpreter: |
b kernel. |
test/amd64/unix -k |
ブートファイルが文字列 kmdb または kadb に設定され、代替カーネルをブートする場合は、-D オプションを使用してブートするカーネルの名前を指定します。この方法で SPARC システムをブートするには、次のコマンドを入力します。
ok boot kmdb -D kernel. |
test/sparcv9/unix |
この方法で 32 ビットの x86 システムをブートするには、次のコマンドを入力します。
Select (b) or (i)nterpreter: |
b kmdb -D kernel. |
test/unix |
この方法で 64 ビットの x86 システムをブートするには、次のコマンドを入力します。
Select (b) or (i)nterpreter: |
b kmdb -D kernel. |
test/amd64/unix |
すでにブートされているシステムをデバッグするには、mdb -K オプションを使用して kmdb を読み込み、カーネルの実行を停止します。この方法でデバッガが読み込まれると、あとで読み込み解除できます。デバッグが完了して kmdb を読み込み解除するには、::quit dcmd に -u オプションを指定します。あるいは、コマンド mdb -U を使用してオペレーティングシステムの実行を再開します。
kmdbでは、対話処理に必ずシステムコンソールが使用されます。kmdb は、次の規則に従って適切な端末を決定します。
デバッグされるシステムが付属のキーボードとモニターをコンソールとして使用し、デバッガがブート時に読み込まれる場合は、プラットフォームアーキテクチャーとコンソール端末の設定に基づいて端末タイプが自動的に決定されます。
デバッグされるシステムがシリアルコンソールを使用し、デバッガがブート時に読み込まれる場合は、デフォルトの端末タイプ vt100 が使用されます。
コンソール上で mdb -K を実行してデバッガを読み込む場合は、$TERM 環境変数の値が端末タイプとして使用されます。
コンソール以外の端末で mdb -K を実行してデバッガを読み込む場合は、システムコンソールのログインプロンプトで使用するように構成された端末タイプが使用されます。
端末タイプを表示するには、kmdb 内部から ::term dcmd を実行します。
オペレーティングシステムカーネルは、ブレークポイントに達したとき、またはほかの実行制御設定 (第 6 章「実行制御」を参照) に従って、暗黙的に実行を停止し、kmdb に入ります。kmdb に入ることを明示的に要求するには、mdb -K オプションまたは適切なキーボードのブレークシーケンスを使用します。SPARC システムのコンソールでは、STOP + A キーシーケンスを使ってブレークを送信し、kmdb に入ります。x86 システムのコンソールでは、F1 + A キーシーケンスを使ってブレークを送信し、kmdb に入ります。Solaris システムでエスケープシーケンスをカスタマイズするには、kbd コマンドを使用します。シリアルコンソールを持つシステムで kmdb に入るには、該当するシリアルコンソールコマンドを使用してブレークシーケンスを送信します。
一部の kmdb 機能は個々のプロセッサアーキテクチャーに固有のものです。たとえば、各種の x86 プロセッサでは、ほかのプロセッサアーキテクチャーでは見られないハードウェア分岐トレース機能をサポートしています。プロセッサ固有の機能にアクセスするには、それをサポートしているシステムにのみ存在するプロセッサ固有の dcmd を使用します。プロセッサ固有のサポートを利用できるかどうかは、::status dcmd の出力に示されます。デバッガは、カーネルに基づいてプロセッサタイプを判断します。このため、デバッガが特定のプロセッサアーキテクチャーの機能を提供できる場合でも、カーネルによってプロセッサの識別が完了するまで、このサポートは有効になりません。