dbx デバッグ・プログラムによるソース・ファイルの表示と操作

このセクションでは、dbx デバッグ・プログラムによるソース・ファイルの表示と操作のプロセスについて説明します。

dbx デバッグ・プログラムを使用すれば、 プログラムのソース・ファイルの一部を検索し表示することができます。

検索するために、現在のソース・リストは必要ありません。 dbx デバッグ・プログラムは、現在のファイル、 現在のプロシージャー、および現在行をトラッキングします。 コア・ファイルが存在している場合、 現在行および現在のファイルは、 そのプロセスが終了したソース・ステートメントが置かれた行およびファイルに最初に設定されます。 このことは、プロセスが、 デバッグ用にコンパイルした位置で停止した場合のみ該当します。

ソース・ディレクトリー・パスの変更

デフォルトで、 dbx デバッグ・プログラムはデバッグ対象のプログラムのソース・ファイルを、 以下のディレクトリーで検索します。

  • ソース・ファイルのコンパイル時のディレクトリー。 このディレクトリーは、コンパイラーがソース・パスをオブジェクト内に置いた場合のみ検索されます。
  • 現行ディレクトリー。
  • プログラムが現在置かれているディレクトリー。

検索するディレクトリーのリストを変更するには、 dbx 呼び出し行上の -I オプションを使用するか、または dbx プログラム内で use サブコマンドを発行します。 例えば、ソース・ファイルをコンパイル後に新しい位置に移動した場合、 これらのうちのいずれかのコマンドを使用して、古い位置、新しい位置、 および一時的な位置を指定しなければならないことがあります。

現在のファイルの表示

list サブコマンドによって、ソース行をリストすることができます。

$ (ドル記号) および @ (単価記号) の記号は、SourceLineExpression を表し、サブコマンド liststop、および trace を使用する場合に便利です。 $ 記号は、実行する次の行を表します。 @ 記号は、リストする次の行を表します。

move サブコマンドは、リストする次の行番号を変更します。

現在のファイルまたはプロシージャーの変更

ユーザーのプログラムの一部を実行することなく、dbx プログラム内の現行ファイル、現行プロシージャー、および現在行を変更するには、func サブコマンドおよび file サブコマンドを使用してください。

正規表現に一致するテキストを現在のファイルで検索します。 一致するテキストが検出されると、現在行が、一致するテキストの入った行に設定されます。 検索サブコマンドの構文を以下に示します。

/ RegularExpression [/]
与えられた式を現在のソース・ファイルで下方に検索します。
? RegularExpression [?]
与えられた式を現在のソース・ファイルで上方に検索します。

引数を指定しないで検索を反復すると、dbx コマンドは、 直前の正規の式を再び検索します。 検索は、ファイルの終わりまたは先頭で循環します。

edit サブコマンドを使用すれば、ソース・ファイル用に外部テキスト・エディターを呼び出すこともできます。 デフォルトのエディター (vi) を指定変更するには、 EDITOR 環境変数を望ましいエディターに設定してから、 dbx プログラムを開始します。

dbx プログラムは、編集セッションが完了すると、 プロセスの制御を再開します。

複数のスレッドが関与したプログラムのデバッグ

複数のユーザー・スレッドに関与したプログラムは、 サブルーチン pthread_create を呼び出します。 プロセスがこのサブルーチンを呼び出すと、オペレーティング・システムは、 このプロセス内で実行に関する新しいスレッドを作成します。 マルチスレッドのプログラムをデバッグする場合、プロセスを処理する代わりに、各スレッドを処理する必要があります。dbx プログラムはユーザー・スレッドのみを処理します。 dbx の資料で、 スレッド という語は通常、 単独で、ユーザー・スレッド を意味するために使用されます。dbx プログラムは、 デバッグ対象のプロセス内の各スレッドに、 固有のスレッド番号を割り当てます。 また、実行スレッドおよび現在のスレッドに関する概念もサポートします。

実行スレッド
ブレークポイントの検出によってプログラムを停止する責任があったユーザー・スレッド。 プログラムをシングル・ステップ化するサブコマンドは、実行スレッドを処理します。
現行スレッド
検査対象のユーザー・スレッド。 情報を表示するサブコマンドは、 現在のスレッドに関する文脈で処理を行います。

デフォルトでは、実行スレッドと現在のスレッドは同じです。 別の現在のスレッドを選択するには、 thread サブコマンドを使用します。thread サブコマンドがスレッドを表示する場合、現在のスレッド行の前に > が付きます。 実行スレッドが現在のスレッドと異なる場合、 実行スレッドの前に * が付きます。

複数のプロセスが関与したプログラムのデバッグ

複数のプロセスが関与したプログラムは、fork および exec サブルーチンを呼び出します。 プログラムが fork すると、 オペレーティング・システムは元のプロセスと同じイメージを持つ別のプロセスを作成します。 元のプロセスを親プロセスと呼びます。 作成されたプロセスを子プロセスと呼びます。

プロセスが exec サブルーチンを実行すると、 新しいプログラムは元のプロセスを引き継ぎます。 通常の場合、デバッグ・プログラムは親プロセスだけをデバッグします。 ただし、multproc サブコマンドを発行した場合、dbx プログラムは実行をフォローし、新しいプロセスをデバッグできます。 multproc サブコマンドによって複数プロセスのデバッグが可能になります。

複数プロセスのデバッグが使用可能で、fork が発生した場合、親プロセスと子プロセスは停止します。 子プロセスの実行を制御するために、 別個の仮想端末 Xwindow が、dbx プログラムの新しいバージョンに関してオープンされます。

(dbx) multproc on
(dbx) multproc
multi-process debugging is enabled
(dbx) run

fork が発生した場合、実行が親の中で停止し、 dbx プログラムはプログラムの状態を表示します。

application forked, child pid = 422, process stopped, awaiting input
stopped due to fork with multiprocessing enabled in fork at 0x1000025a (fork+0xe)
(dbx)

次に、子プロセスをデバッグするために、 もう 1 つの仮想端末 Xwindow がオープンされます。

debugging child, pid=422, process stopped, awaiting input
stopped due to fork with multiprocessing enabled in fork at 0x10000250
10000250 (fork+0x4) )80010010    1       r0,0x10(r1)
(dbx)

この時点で、2 つの異なるデバッグ・セッションが実行中です。 子プロセスのデバッグ・セッションは、 親プロセスからのすべてのブレークポイントを保持していますが、 再実行できるのは、親プロセスだけです。

プログラムは、複数プロセス・デバッグ・モードで exec サブルーチンを実行した場合、 自分自身に上書きし、元のシンボル情報が古くなります。 exec サブルーチンを実行すると、 すべてのブレークポイントが削除されます。 デバッグを無意味にしないために、 新しいプログラムが停止され、識別されます。 dbx プログラムは、 自分自身を新しいプログラム・イメージに接続し、サブルーチンに新しいプログラムの名前を判別させ、 名前を報告し、入力を指示するプロンプトを表示します。 プロンプトは次のようになります。

(dbx) multproc
Multi-process debugging is enabled
(dbx) run
Attaching to program from exec . . . 
Determining program name . . . 
Successfully attached to /home/user/execprog . . . 
Reading symbolic information . . . 
(dbx)

マルチスレッド・プログラムが fork する場合、新しい子プロセスは 1 つのスレッドしか持ちません。プロセスは exec サブルーチンを呼び出す必要があります。 さもないと、元のシンボル情報が保持され、 スレッド関連のサブコマンド (例えば、thread) は、古い、 親プロセスのオブジェクトを表示します。 exec サブルーチンを呼び出すと、 元のシンボル情報が再初期化され、スレッド関連サブコマンドは新しい子プロセス内のオブジェクトを表示します。

multproc サブコマンドの child フラグを使用すれば、 新しい Xwindow をオープンしないで、fork の子プロセスをトラッキングすることができます。fork したプロセスが作成されると、 dbx は子プロセスをトラッキングします。multproc サブコマンドの parent フラグによって、 dbx は、プログラムの fork に停止しますが、 その後、親をトラッキングします。 child および parent フラグは、実行されたプロセスをトラッキングします。 これらのフラグは、Xwindow が実行中でない場合のプログラムのデバッグに非常に役立ちます。