Go to main content
マニュアルページ セク ション 1: ユー ザーコマンド

印刷ビューの終了

更新: 2016年12月6日
 
 

kmdb(1)

名前

kmdb - 原状態カーネルデバッガ

形式

ブート時の読み込み

SPARC

ok boot [device-specifier] -k [-d] [boot-flags]
ok boot [device-specifier] kmdb [-d] [boot-flags]

x86

kernel$ /platform/i86pc/kernel/$ISADIR/unix -k [-d] [boot-flags]

実行時の読み込み

mdb -K

説明

kmdb は、ライブカーネルコンテキストでの mdb(1) のユーザーインタフェースと機能を実装した、対話型のカーネルデバッガです。kmdb を使用すると、カーネル実行の制御およびライブカーネル状態の検査と変更を実行できます。kmdb の読み込みは、ブートセッションの開始時またはシステムのブート後に実行できます。

このマニュアルページでは、kmdb に固有の機能、および mdb(1) と比較して異なる kmdb の機能について説明します。mdb(1)、または kmdb により実装される機能の詳細については、mdb(1) のマニュアルページおよびOracle Solaris Modular Debugger Guideを参照してください。

読み込みと読み込み解除

ブート時の読み込み

要求があると、カーネル実行時リンカー (krtld) は kmdb を読み込んでから制御をカーネルに渡します。–d フラグが指定されていると、デバッガはシステムの制御を取得してから unix オブジェクトの初期関数を実行します。–d が指定されていない場合、kmdb は読み込まれますが、明示的にそのモードに入るまで制御は取得しません。後述の「デバッガのエントリ」のセクションを参照してください。ブート時に kmdb の読み込みを実行するブートコマンドの一覧については、前述の「形式」のセクションを参照してください。このコマンドを使って、SPARC マシンのブート時に kmbd が常に読み込まれるようにする方法については、eeprom(1M) を参照してください。

ブート時に読み込まれた kmdb は、システムのリブートによってのみ読み込みを解除できます。

kmdb の一部の機能はカーネルサービスの存在に依存しているため、ブート時に読み込まれた kmdb からすぐに使用することはできません。特に dmods の読み込みと読み込み解除は、モジュールサブシステムが初期化されるまで使用できません。要求は、処理可能になるまで待ち行列に入れられます。同様に、仮想アドレスから物理アドレスへの変換も VM システムが初期化されるまで使用できません。この機能が使用可能になるまで、変換を試みても失敗します。

実行時の読み込み

mdb(1)–K フラグを使用すると、システムのブート後に kmdb を読み込むこともできます。この方法で読み込まれた場合、kmdb はただちにシステムの制御を取得します。実行時に読み込まれた kmdb を読み込み解除するには、mdb(1)–U フラグを使用するか、デバッガ内で ::quit dcmd–u フラグを使用します。

端末タイプ

読み込み時に、kmdb はシステムコンソールで使用されている端末タイプの判別を試みます。デバッグ対象のシステムにシステムコンソール用のキーボードとローカルディスプレイが接続されている場合、kmdb はマシンに適した端末タイプ (SPARC の場合には「sun」、x86 の場合には「sun-color」) を使用します。シリアルコンソールが使用されている場合、ブート時に読み込まれる kmdb のデフォルトの端末タイプは「vt100」になります。実行時に読み込まれる kmdb のデフォルトは、mdb(1) により要求される端末タイプになります。mdb(1) は、–T フラグで上書きされていないかぎり、TERM 環境変数の値で指定された端末タイプを要求します。::term を使うと、現在の端末タイプを表示できます。

デバッガのエントリ

デバッガのエントリは、明示的または暗黙的に要求できます。暗黙的なエントリは、ブレークポイントまたはその他の実行制御機能の使用時に検出されます。詳細は、「実行制御」のセクションを参照してください。

デバッガのエントリを明示的に要求するプライマリな方法には、ローカルコンソールでシステムのキーボードアボートシーケンスを使用する方法と、シリアルコンソールで BREAK 文字を使用する方法があります。アボートシーケンスは、SPARC システムのローカルコンソールでは STOP-A または Shift-Pause、x86 システムのローカルコンソールでは F1–A または Shift-Pause です。アボートシーケンスおよびそれを無効にする方法については、kbd(1) を参照してください。

デバッガのエントリを要求する 2 番目の方法は、mdb(1) コマンドを使用するものです。デバッガの読み込み後に mdb(1)–K フラグを指定して呼び出すと、デバッガのエントリがトリガーされます。

カーネルパニックおよび kmdb が読み込まれると、デフォルトでパニックルーチンが kmdb に入り、ライブデバッグが実行されます。ダンプデバイスが指定されていて、かつ ::cont に入ると、デバッガが終了してクラッシュダンプが実行されます。パニックの発生時にカーネルが kmdb に入らないようにするには、nopanicdebug 変数を 1 に設定します。kmdb を使用するか、次の行を /etc/system に含めて、nopanicdebug 変数を 1 に設定します。


set nopanicdebug = 1

これは、kmdb を読み込んだ状態を維持するが、デバッガに入ることなくパニックが常にクラッシュダンプをトリガーするようにする場合に役立ちます。

実行制御

ほとんどの場合、kmdb によりカーネルに提供される実行制御機能は、mdb(1) プロセスのターゲットにより提供される実行制御機能を反映しています。ブレークポイント (::bp)、ウォッチポイント (::wp)、::continue、および ::step のさまざまな特性を使用できます。

カーネルにより提供される無制限のユーザープロセスウォッチポイントとは異なり、kmdb は 1 つの CPU ウォッチポイントセットに制限されており、これによってウォッチポイントの数、サイズ、種類が限定されます。ウォッチポイントがハードウェアのサポートするウォッチポイントと互換性がない場合、::wp コマンドはそのウォッチポイントの作成を許可しません。

デバッガモジュール (dmods)

mdb(1) の場合と同様に、kmdb をインストールすると、多数のサブシステム固有のデバッガモジュール (dmods) もインストールされます。dmods は、サポートするサブシステムの読み込みや読み込み解除に合わせて、自動的に読み込みまたは読み込み解除されます。::load::unload を使用すると、dmods を明示的に読み込んだり、読み込み解除したりすることもできます。

kmdb は、カーネルの機能を使って dmods の読み込みと読み込み解除を行います。また、システムの実行を再開して要求された各操作を実行する必要があります。dmod の読み込みまたは読み込み解除が完了すると、システムが停止して、自動的にデバッガが再度エントリされます。dmod の読み込み時には、要求された dmod の読み込みが成功または失敗すると処理が完了します。どちらの場合でも、ステータスメッセージが出力されます。

プロセッサ固有の機能

一部の機能は、個々のプロセッサタイプに固有のものです。この種の機能の例には、さまざまな x86 プロセッサで提供されている分岐トレースがあります。これらのプロセッサ固有の機能にアクセスするには、それをサポートしているシステムにのみ存在するプロセッサ固有の dcmd を使用します。プロセッサ固有のサポートを利用できるかどうかは、::status dcmd の出力に示されます。デバッガは、カーネルに基づいてプロセッサタイプを判断します。デバッガは特定のプロセッサタイプをサポートしている場合でも、カーネルによりプロセッサの識別が完了するまでサポートは公開されません。

カーネルマクロ

デバッガに内蔵されているコンパイル済みマクロセットにアクセスできます。使用できるのはコンパイル済みのマクロだけです。mdb(1) とは異なり、 $< dcmd を使用して任意の場所からマクロを読み込むことはできません。使用可能なマクロの一覧を表示するには、$M コマンドを使用します。

組み込み dcmd

このセクションでは、kmdb に固有の dcmd、および kmdb の dcmd の中で mdb(1) と動作が異なるものの一覧を示します。

[address]::bp [+/-dDestT] [–c cmd] [–n count] sym ...
address :b [cmd ...]

指定された場所にブレークポイントを設定します。::bp dcmd は、指定されたアドレスまたはシンボル (dcmd の前にある明示的な式で指定されたオプションのアドレスを含む) ごと、そして、dcmd の後ろにある文字列または即値ごとにブレークポイントを設定します。引数には、指定された特定の仮想アドレスを示すシンボル名または即値を指定できます。

シンボル名を指定した場合は、まだ評価できないシンボルを参照できます。まだ読み込んでいないオブジェクト内のオブジェクト名や関数名を参照できます。この場合、ターゲット内のブレークポイントは延期され、指定された名前に一致するオブジェクトが読み込まれるまでアクティブ (有効) になりません。オブジェクトが読み込まれると、このブレークポイントは自動的に有効になります。

–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです。::evset については、mdb(1) を参照してください。dcmd の :b 形式を使用した場合、ブレークポイントは dcmd の前にある式で指定した仮想アドレスだけに設定されます。:b dcmd の後ろにある引数は連結され、コールバック文字列となります。この文字列にメタキャラクタが含まれる場合、文字列を引用符で囲む必要があります。

::branches [–v]
(x86 のみ)

CPU が選択した最後の分岐を表示します。この dcmd は x86 システムでのみサポートされます。また、プロセッサ固有のサポートが検出されて有効化されている場合にのみ使用できます。表示される分岐の数と種類は、CPU の提供する分岐トレース機能によって異なります。–v オプションを使用すると、指定した分岐より前の命令が表示されます。

[function] ::call [arg [arg ...]]

指定した関数を、指定した引数を使って呼び出します。呼び出された関数は、読み込まれたモジュールのシンボルテーブル内の関数として表示されます。文字列引数は、参照により渡されます。呼び出しが完了すると、その関数の戻り値が表示されます。

この dcmd は、きわめて慎重に使用する必要があります。呼び出しが行われても、カーネルは再開されません。呼び出された関数は、使用可能なカーネルサービスに関してどのような想定も行えません。また、ブロックするような操作や呼び出しを実行してはなりません。ユーザーは、呼び出された関数により発生する副作用についても警戒しておく必要があります。カーネルの安定性が影響を受ける可能性があるためです。

[addr] ::cpuregs [–c cpuid]

指定された CPU の現在の汎用レジスタセットを、::regs で使用される書式で表示します。

[addr] ::cpustack [–c cpuid]

指定された CPU の C スタックバックトレースを出力します。表示されるバックトレースは、デバッガが指定された CPU をエントリまたは停止した時点のものです。

addr[,len] ::in [–L len]
(x86 のみ)

addr で指定された入出力ポートから len バイトを読み込みます。–L オプションが指定されている場合は、このオプションが繰り返し回数の値よりも優先されます。読み取り長は 1、2、または 4 バイトにする必要があり、ポートアドレスはこの長さと同じ配置にする必要があります。

addr[,len] ::out [–L len] value
(x86 のみ)

値を addr で指定された len バイトの入出力ポートに書き込みます。–L オプションが指定されている場合は、このオプションが繰り返し回数の値よりも優先されます。書き込み長は 1、2、または 4 バイトにする必要があり、ポートアドレスはこの長さと同じ配置にする必要があります。

::quit [–u]
$q

デバッガを終了します。–u オプションを使用すると、システムが再開されて、デバッガが読み込み解除されます。ブート時にデバッガが読み込まれた場合、–u オプションは使用できません。–u オプションを使用すると、SPARC システムが終了して、ブート PROM の ok プロンプトが表示されます。go コマンドを使用するとデバッガを再度エントリできます。x86 システムでは、マシンをリブートするための許可を求めるプロンプトが表示されます。

::step [over|out|branch]

ターゲットを 1 命令だけ実行します。サブルーチンの呼び出しまで進めるには、オプションの over 引数を使用します。オプションの out 引数を指定した場合、制御が現在の関数から戻ってくるまで、ターゲットプログラムは実行を継続します。

オプションの branch 引数は、x86 システムでプロセッサ固有のサポートが検出されて有効化されている場合にのみ使用できます。::step branch が指定されている場合、次の分岐命令が検出されるまでターゲットプログラムは実行を継続します。

SPARC システムでは、::step dcmd を使用して「ta」命令を実行することはできません。同様に、x86 システムで、これを使用して「int」命令を実行することもできません。実行によりデバッガで解決できないトラップが生成された場合は、その効果に対するメッセージが出力されて実行が失敗します。

cpuid::switch
cpuid:x

指定された CPU を代表として使用します。スタックトレース、汎用レジスタダンプ、および類似の機能で、新しい代表 CPU がデータソースとして使用されます。新しい代表 CPU では完全な実行制御機能を使用できます。

::term

現在の端末タイプを表示します。

addr[,len]::wp [+/-dDestT] [–rwx] [–pi] [–n count] [–c cmd]
addr[,len]:a [cmd ...]
addr[,len]:p [cmd ...]
addr[,len]:w [cmd ...]

指定されたアドレスにウォッチポイントを設定します。これは、デフォルトで仮想アドレスとして解釈されます。–p オプションを指定した場合、アドレスは物理アドレスとして解釈されます。x86 プラットフォームでは、–i オプションを使用するとウォッチポイントを入出力ポート上に設定できます。–i オプションを指定した場合、アドレスは入出力ポートのアドレスとして解釈されます。

監視される領域の長さをバイト数で設定するには、dcmd の前に繰り返し回数を指定します。長さを明示的に設定しない場合、デフォルトは 1 バイトです。::wp dcmd を使用すると、読み取り (–r オプション)、書き込み (–w オプション)、または実行 (–x オプション) のアクセス権の任意の組み合わせでのトリガーが可能となるようにウォッチポイントを構成できます。

–d–D–e–s–t–T–c、および –n オプションは、::evset dcmd で使用するのと同じです。::evset については、mdb(1) を参照してください。:a dcmd は、指定されたアドレスに読み取り権のウォッチポイントを設定します。:p dcmd は、指定されたアドレスに実行権のウォッチポイントを設定します。:w dcmd は、指定されたアドレスに書き込み権のウォッチポイントを設定します。:a:p、および :w dcmd の後ろにある引数は連結され、コールバック文字列となります。この文字列にメタキャラクタが含まれる場合、文字列を引用符で囲む必要があります。

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

属性タイプ
属性値
使用条件
system/kernel (デバッガ)
developer/debug/mdb (dmod)
インタフェースの安定性
確実

関連項目

mdb(1), boot(1M), dumpadm(1M), eeprom(1M), kernel(1M), system(4), attributes(5)

Oracle Solaris Modular Debugger Guide

SPARC のみ

kbd(1)

デバッガで使用可能なメモリーに関する制限

デバッガで使用可能なメモリー領域は、デバッガの読み込み時に割り当てられ、その時点で固定されます。dcmd が使用可能なメモリーより多くのメモリーの割り当てを試みると、終了させられます (可能な場合)。デバッガは、メモリー不足の状態からの正常な回復を試みますが、それができない場合にはシステムを強制終了することがあります。この制約は、特に 32 ビットの x86 システムで深刻な問題になります。

パフォーマンスへの影響

kmdb の読み込みにより、システムのパフォーマンスが悪影響を受けます。これは、デバッガがカーネルメモリーおよびその他の限定されたシステムリソースを消費するためです。

kmdb のブートによる panic() スタックの取得

eeprom(1M) を使用してブート時にシステムが常に kmdb を読み込むように設定すると、SPARC マシンで発生する panic() のトラブルシューティングに役立つことがあります。パニックが発生すると、システムがリブートを開始することにより、パニックスタックがコンソールから消去されます。kmdb をブートすることで、パニックスタックを取得して解釈できるようになります。ブート時に kmdb の読み込みを指定する方法については、eeprom(1M) の例を参照してください。