dbx デバッグ・プログラムの使用
この項では、dbx デバッグ・プログラムを使用する方法について説明します。
dbx デバッグ・プログラムの開始
dbx プログラムは、 さまざまなフラグを使用して開始することができます。 dbx プログラムを使用するデバッグ・セッションを開始するための、 最も一般的な 3 つの方法を次に示します。
- 指定されたオブジェクト・ファイルに対する dbx コマンドの実行
- 異常終了したプログラムで dbx コマンドを実行するための -r フラグの使用
- 既に進行中のプロセスに対して dbx コマンドを実行するための -a フラグの使用
dbx コマンドは、開始すると、 ユーザーの現在のディレクトリーおよびユーザーの $HOME ディレクトリー内で、 .dbxinit ファイルがあるかどうかを検査します。 .dbxinit ファイルが存在している場合、 デバッグ・セッションの開始時に、そのサブコマンドを実行します。 .dbxinit ファイルがホーム・ディレクトリーと現在のディレクトリーの両方に存在している場合、 両方がこの順番に読み取られます。 現在のディレクトリーの .dbxinit ファイルが最後に読み取られるので、 そのサブコマンドがホーム・ディレクトリーのサブコマンドに置き換わることがあります。
オブジェクト・ファイルを指定しない場合、dbx プログラムは、 調べる必要があるオブジェクト・ファイルの名前を尋ねます。 デフォルトは a.outです。 現在のディレクトリーに core ファイルが存在しているか、 または CoreFile パラメーターを指定した場合、 dbx プログラムによって、プログラムの障害がある位置が報告されます。 オブジェクト・ファイルの実行が開始されるまで、 コア・イメージに保持されている変数、レジスター、およびメモリーを調べることができます。 プログラムの実行が始まると、 dbx デバッグ・プログラムはコマンドの入力を促すプロンプトを表示します。
欠落従属モジュールがあるコア・イメージのデバッグ
AIX® 5.3以降、'dbxプログラムには、1つまたは複数の依存モジュールがアクセスできない場合でも、コアイメージを検査する機能があります。 初期設定中に、欠落している従属モジュールごとに通知メッセージが表示されます。
- ユーザーが欠落従属モジュールのテキスト・セクションに入っている メモリーの内容を読もうと試みると、エラー・メッセージが出ます。 このエラー・メッセージは、データがコア・ファイルに入っていないために データをアクセスできない場合に起きるエラーと同様です。
- ユーザーは、欠落従属モジュールのシンボル・テーブルから読み取られるはずであった シンボルに関する情報は、得られません。 dbx プログラムの動作は、従属モジュールのシンボル・テーブルが除去された場合と似ています。
- 欠落従属モジュール内のルーチンに対応するスタック・フレームは、
単に以下のように表示されます。
さらに、不明ルーチン内の命令アドレスと、対応する欠落従属モジュールの名前が 表示されます。.()
ユーザーは常に、 -p フラグを使用して、アクセス可能な従属モジュールに dbx プログラムを送信するオプションを使用できます。
ミスマッチ従属モジュールがあるコア・イメージのデバッグ
AIX 5.3以降、 dbx プログラムは、コア・ファイルで参照される従属モジュールがコア・ファイルの作成時と異なるかどうかを検出します。 初期設定中に、ミスマッチの従属モジュールごとに通知メッセージが表示されます。
ユーザーは、一致しない従属モジュールの内容に基づいて dbx プログラムによって表示される情報が信頼できない可能性があることに注意する必要があります。 信頼できない情報をユーザーに警告するために、 dbx プログラムは、疑わしい情報が表示されるたびに通知メッセージを送信します。
この機能を使用不可にして、 dbx プログラムが一致しない従属モジュールを欠落従属モジュールとして扱うように強制するには、 DBX_MISMATCH_MODULE 環境変数を DISCARD の値でエクスポートします。 この変数をエクスポートしても、 dbx プログラムはユーザーに不一致を通知しますが、不一致の従属モジュールがアクセス不能であるかのように処理を進めます。
ユーザーは常に、 -p フラグを使用して、 dbx プログラムを一致する従属モジュールに送信するオプションを使用できます。
dbx からのシェル・コマンドの実行
sh サブコマンドを使用すると、デバッグ・プログラムを終了せずにシェル・コマンドを実行することができます。
コマンドを指定しないで sh を入力するとシェルに入り、 終了するまでシェルを使用することができます。終了すると、 制御が dbx プログラムに戻ります。
dbx におけるコマンド・ライン編集
dbx コマンドは、 Korn Shell によって提供される機能に似ているコマンド・ライン編集機能を提供します。 vi モードは vi に似た編集機能を提供し、 emacs モードは emacs に似た制御をユーザーに提供します。
これらの機能をオンにするには、dbxのサブコマンド set-oまたはset editを使う。 したがって、 viスタイルのコマンド行編集をオンにするには、次のサブコマンドを入力します。set edit viまたはset -o vi.
EDITOR 環境変数を使用しても、編集モードを設定することができます。
dbx コマンドは、 入力されたコマンドをヒストリー・ファイル .dbxhistory に保管します。 DBXHISTFILE 環境変数を設定しない場合、 使用されるヒストリー・ファイルは $HOME/.dbxhistory です。
デフォルトで、dbx コマンドは、 最後に入力された 128 個のコマンドのテキストを保管します。 DBXHISTSIZE 環境変数を使用して、この制限を増やすことができます。
プログラム制御の使用
dbx デバッグ・プログラムによって、 プログラム内にブレークポイント (停止位置) を設定することができます。 dbx プログラムに入った後、 ブレークポイントにする行またはアドレスを指定してから、 dbx プログラムを使用してデバッグする必要があるプログラムを実行することができます。 ブレークポイントに到達すると、 プログラムは停止し、報告を行います。 次に、dbx コマンドを使用して、 ユーザーのプログラムの状態を調べることができます。
ブレークポイントを設定する別の方法は、 ユーザーのプログラムを一度に 1 行または 1 命令ずつ実行する、 シングル・ステップ化と呼ばれる手順です。
ブレークポイントの設定と削除
stop サブコマンドは、 dbx プログラムにブレークポイントを設定するために使用します。 stop サブコマンドは、 以下のような特定の条件が満たされた場合に、 アプリケーション・プログラムを停止します。
- Variable パラメーターを指定した場合に、Variable (変数) が変更された場合。
- Condition は、 if 条件 フラグが使用されている場合にtrueになります。
- Procedure は、 における Procedure フラグが使用されるときに呼び出されます。
- atSourceLine フラグが使用されている場合は、 SourceLine 行番号になります。
注: SourceLine 変数は、 整数として、またはファイル名文字列の後に続く : (コロン) および整数として指定することができます。
これらのいずれかのコマンドの後に、dbx プログラムは、ユーザーのブレークポイントに関連するイベント ID およびコマンドの解釈を報告するメッセージを使用して応答します。 addcmd サブコマンドを使用して、指定されたイベント ID に dbx サブコマンドを関連付けることができます。 これらの関連付けられた dbx サブコマンドは、このイベントに対応するブレークポイント、トレース・ポイント、または監視ポイントが検出されたときに発行されます。 delcmd サブコマンドは、指定されたイベント ID から関連する dbx サブコマンドを削除するために使用します。
プログラムの実行
run サブコマンドは、プログラムを開始します。 このサブコマンドは、dbx プログラムに、引数を、 シェル・コマンド・ラインに入力されたかのように読み取って、 オブジェクト・ファイルの実行を開始するように指示します。 rerun サブコマンドは、 runと同じ形式です。違いは、引数が渡されない場合には、直前の実行からの引数リストが使用されることです。 プログラムは、開始後、以下のいずれかのイベントが発生するまで継続します。
- プログラムがブレークポイントに到達した。
- INTERRUPT または QUIT などの無視されないシグナルが発生した。
- 複数プロセス・デバッグが使用可能な場合に、 複数プロセス・イベントが発生した。
- プログラムは、 load、 unload、 または loadbind サブルーチン。
注: dbx プログラムは、 $ignoreload デバッグ変数が設定されている場合には、この条件を無視します。 これはデフォルトです。 詳しくは、 set サブコマンドを参照してください。
- プログラムが完了した。
それぞれの場合、 dbx デバッグ・プログラムに制御が渡り、 プログラムが停止した理由を説明するメッセージが表示されます。
プログラムが停止した後に継続する方法は、いくつかあります。
| コマンド | 説明 |
|---|---|
| 続き | プログラムを停止した個所から継続します。 |
| detach | デバッグ・プログラムを終了して、プログラムを停止した個所から継続します。 これは、プログラムのパッチを行った後に、 デバッグ・プログラムを使用しないでプログラムの実行を継続したい場合に便利です。 |
| return | Procedure への戻りが検出されるまで、 または Procedure が指定されていない場合には、 現在のプロシージャーが戻りを実行するまで、実行を継続します。 |
| スキップ | プログラムの最後まで、または Number + 1 ブレークポイントが実行されるまで、実行を継続します。 |
| ステップ | 1 つの、または指定された Number 行のソース行を実行します。 |
| 次へ | 実行を次のソース行に進めるか、または指定された Number 行のソース行を実行します。 |
デバッグの通常の方法は、 プログラムを一度に 1 行ずつのステップで調べるというものです。 step および next サブコマンドは、この目的に使用することができます。 これらの 2 つのコマンドの相違点が明白になるのは、 実行する次のソース行にサブプログラムへのコールが関与している場合だけです。 この場合、step サブコマンドはサブプログラム内で停止しますが、 next サブコマンドは、 サブプログラムが終了するまで実行してから、コールの後の次の命令で停止します。
$stepignore デバッグ変数は、 step サブコマンドの振る舞いを変更するために使用することができます。
プログラムの停止に関連する永久イベントはないので、 これらの停止に関連するイベント番号はありません。
プログラムに複数のスレッドがある場合、すべてのスレッドは、cont、 next、nexti、および step サブコマンドの間、正常に実行します。 これらのコマンドは、実行スレッド (ブレークポイントの検出によって実行を停止したスレッド) に作用します。したがって、別のスレッドがステップ操作中のコードを実行している場合でも、cont、next、nexti、または step 操作は、実行スレッドがそのコードの実行も終了するまで継続します。
これらのサブコマンドが実行スレッドだけを実行するようにしたい場合、 dbx デバッグ・プログラム変数 $hold_next を設定することができます。 これによって、dbx デバッグ・プログラムは、 cont、next、 nexti、 および step サブコマンドの実行中に、 他のすべてのユーザー・スレッドを保留することができます。
注: この機能を使用する場合、保留スレッドは、 獲得したロックを解放できないことに注意してください。 これらのいずれかのロックが必要な別のスレッドによって、 プログラムがデッドロックされる可能性があります。
プログラム出力からの dbx 出力の分離
テキスト・エディターまたはグラフィックス・プログラムなどの、 スクリーン指向のプログラムをデバッグするには、 screen サブコマンドを使用します。 このサブコマンドは dbx コマンドの対話用の Xwindow をオープンします。 プログラムは、開始されたウィンドウ内で稼働を継続します。 screen を使用しない場合、 dbx プログラム出力は画面指向のプログラム出力と混在します。
実行のトレース
trace サブコマンドは、プログラムの実行中にデバッグ中のプログラムの状態に関する情報を印刷するように dbx プログラムに指示します。 trace サブコマンドは、dbx プログラムが実行する必要がある作業量によっては、 プログラムの速度をかなり低下させる可能性があります。 プログラム・トレースには、以下の 5 つの形式があります。
- プログラムをシングル・ステップ化し、 実行される各ソース行を印刷することができます。 $stepignore デバッグ変数を使用して、 trace サブコマンドの動作を変更することができます。 詳しくは、 set サブコマンドを参照してください。
- ソース行の印刷を、指定したプロシージャーがアクティブな場合に限定することができます。 トレース情報を生成する時点を制御するために、 オプショナルの条件を指定することもできます。
- プロシージャーが呼び出されるたびに、あるいは戻されるたびに、 メッセージを表示することができます。
- プログラムが指定したソース行に到達した時に、その行を印刷することができます。
- プログラムが指定したソース行に到達した時に、式の値を印刷することができます。
トレース・イベントの削除は、停止イベントの削除と同じです。 trace サブコマンドの実行時に、関連するイベント ID が、 イベントの内部表現とともに表示されます。