Solaris モジューラデバッガ

第 7 章 カーネル実行制御

この章では、kmdb の実行時に利用できる動作中のオペレーティングシステムカーネルの実行制御用の MDB 機能について説明します。kmdb は、特にカーネルの実行制御と動作中のカーネルのデバッグ用に作られた MDB バージョンです。kmdb を使用すると、mdb を使ってユーザープロセスを制御および監視するのと同じように、カーネルを制御および監視できます。カーネル実行制御機能には、各 CPU で実行されているカーネルスレッドを命令レベルで制御する機能が含まれているため、開発者はカーネルをステップ実行して、リアルタイムでデータ構造体を調べることができます。

mdbkmdb は同じユーザーインタフェースを共有しています。第 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 は、次の規則に従って適切な端末を決定します。

端末タイプを表示するには、kmdb 内部から ::term dcmd を実行します。

デバッガのエントリ

オペレーティングシステムカーネルは、ブレークポイントに達したとき、またはほかの実行制御設定 (第 6 章「実行制御」を参照) に従って、暗黙的に実行を停止し、kmdb に入ります。kmdb に入ることを明示的に要求するには、mdb -K オプションまたは適切なキーボードのブレークシーケンスを使用します。SPARC システムのコンソールでは、STOP + A キーシーケンスを使ってブレークを送信し、kmdb に入ります。x86 システムのコンソールでは、F1 + A キーシーケンスを使ってブレークを送信し、kmdb に入ります。Solaris システムでエスケープシーケンスをカスタマイズするには、kbd コマンドを使用します。シリアルコンソールを持つシステムで kmdb に入るには、該当するシリアルコンソールコマンドを使用してブレークシーケンスを送信します。

プロセッサ固有の機能

一部の kmdb 機能は個々のプロセッサアーキテクチャーに固有のものです。たとえば、各種の x86 プロセッサでは、ほかのプロセッサアーキテクチャーでは見られないハードウェア分岐トレース機能をサポートしています。プロセッサ固有の機能にアクセスするには、それをサポートしているシステムにのみ存在するプロセッサ固有の dcmd を使用します。プロセッサ固有のサポートを利用できるかどうかは、::status dcmd の出力に示されます。デバッガは、カーネルに基づいてプロセッサタイプを判断します。このため、デバッガが特定のプロセッサアーキテクチャーの機能を提供できる場合でも、カーネルによってプロセッサの識別が完了するまで、このサポートは有効になりません。