Oracle® Developer Studio 12.5: dbx コマンドによるデバッグ

印刷ビューの終了

更新: 2016 年 6 月
 
 

ブレークポイントの設定

    dbx では、ブレークポイントを設定するため、3 種類のコマンドを使用することができます。

  • stop – プログラムは stop コマンドで作成されたブレークポイントに到達すると停止します。このプログラムは、contstep、または next などのほかのデバッグコマンドを発行するまで再開できません。

  • when – プログラムは when コマンドで作成されたブレークポイントに到達すると停止し、dbx が 1 つまたは複数のデバッグコマンドを実行した後、プログラムは実行コマンドに stop が含まれていないかぎり続行します。

  • trace – trace は変数の値の変更など、プログラム内のイベントに関する情報を表示します。トレースの動作はブレークポイントと異なりますが、トレースとブレークポイントは類似したイベントハンドラを共有します。プログラムは、trace コマンドで作成されたブレークポイントに到達すると処理を停止し、イベント固有の trace 情報行を出力したあと、処理を再開します。

stopwhen、および trace コマンドはすべて、イベントの指定を引数として取ります。イベントの指定は、ブレークポイントのベースとなるイベントを説明しています。イベント指定の詳細については、イベント指定の設定を参照してください。

マシンレベルのブレークポイントを設定するには、stopiwheni、および tracei コマンドを使用します。詳細は、機械命令レベルでのデバッグを参照してください。


注 -  Java コードと C JNI (Java Native Interface) コードまたは C++ JNI コードの混在するアプリケーションをデバッグする際に、まだロードされていないコードにブレークポイントを設定したいと考える場合があります。これらのコードへのブレークポイントの設定の詳細については、ネイティブ (JNI) コードでブレークポイントを設定するを参照してください。

ソースコードの行へのブレークポイントの設定

stop at コマンドを使用して、行番号にブレークポイントを設定できます。ここで、n はソースコードの行番号、filename はオプションのプログラムファイル名修飾子です。

(dbx) stop at filename:n

例:

(dbx) stop at main.cc:3

指定された行が、ソースコードの実行可能行ではない場合、dbx は次の有効な実行可能行にブレークポイントを設定します。実行可能な行がない場合、dbx はエラーを出します。

停止させる行を決定するには、file コマンドで現在のファイルを設定し、list コマンドで停止させる関数を使用します。次に、次の例に示すように、stop at コマンドを使用してソース行にブレークポイントを設定します。

(dbx) file t.c
(dbx) list main
10    main(int argc, char *argv[])
11    {
12        char *msg = "hello world\n";
13        printit(msg);
14    }
(dbx) stop at 13

「at 場所」イベントを指定する詳細については、at イベント指定を参照してください。

関数へのブレークポイントの設定

stop in コマンドを使用して、関数にブレークポイントを設定できます。

(dbx) stop in function

関数内ブレークポイントは、プロシージャまたは関数の最初のソース行の先頭でプログラムの実行を中断します。

    dbx は次の状況を除いて、参照されている関数を特定できるはずです。

  • 名前のみで、オーバーロードした関数を参照する場合

  • 先頭に ` が付く関数を参照する場合

  • リンカー名 (C++ でのマングル名) で関数が参照されている。この場合、dbx は、名前の前に # が付けられていれば、名前を受け付けます。詳細については、リンカー名を参照してください。

次の宣言を考えてみましょう。

int foo(double);
int foo(int);
int bar();
class x {
   int bar();
};

非メンバー関数で停止するには、次のコマンドでグローバル foo(int) にブレークポイントを設定します。

stop in foo(int)

メンバー関数にブレークポイントを設定するには:

stop in x::bar()

次のコマンドでは、dbx でグローバル関数 foo(int) またはグローバル関数 foo(double) のどちらを意味しているのかを判断できないため、明確にするためにオーバーロードしたメニューを表示させることができます。

stop in foo

次のように入力すると:

stop in `bar

dbx は、ユーザーがグローバル関数 bar() と、メンバー関数 bar() のどちらを意味しているのかを判断することができないため、オーバーロードしたメニューを表示します。


注 -  unique_member など、メンバー名が一意の場合、stop in unique_member を使用すれば十分です。メンバー名が一意でない場合は、stop in コマンドを使用して、意図するメンバーを指定するためのオーバーロードメニューに応答することができます。

関数内イベントの指定の詳細については、in イベント指定を参照してください。

C++ プログラムへの複数のブレークポイントの設定

異なるクラスのメンバー関数の呼び出し、特定のクラスのすべてのメンバー関数の呼び出し、または多重定義されたトップレベル関数の呼び出しに関連する問題が発生する可能性があります。stopwhen、または trace コマンドで、キーワード inmemberinclassinfunction、または inobject を使用して、C++ コードに複数のブレークポイントを設定できます。

異なるクラスのメンバー関数にブレークポイントを設定する

特定のメンバー関数のクラス固有のバリアント (同じメンバー関数名で異なるクラス) のそれぞれにブレークポイントを設定するには、 stop inmember を使用します。

たとえば、関数 draw が複数の異なるクラスに定義されている場合は、それぞれの関数ごとにブレークポイントを設定します。

(dbx) stop inmember draw

inmember または inmethod イベントを指定する詳細については、inmember イベント指定を参照してください。

クラスのすべてのメンバー関数にブレークポイントを設定する

特定のクラスのすべてのメンバー関数にブレークポイントを設定するには、 stop inclass コマンドを使用します。

デフォルトでは、ブレークポイントはクラスで定義されたクラスメンバー関数だけに挿入され、ベースクラスから継承した関数には挿入されません。ベースクラスから継承した関数にもブレークポイントを挿入するには、-recurse オプションを指定します。

次のコマンドは、クラス shape で定義されたすべてのメンバー関数にブレークポイントを設定します。

(dbx) stop inclass shape

次のコマンドは、クラスで定義されたすべてのメンバー関数およびクラスから継承する関数にブレークポイントを設定します。

(dbx) stop inclass shape -recurse

inclass イベントを指定する詳細については、inclass イベント指定および stop コマンドを参照してください。

stop inclass およびその他のブレークポイントの選択により、大量のブレークポイントが挿入される可能性があるため、dbxenv 変数 step_events を必ず on に設定し、step および next コマンドの速度を上げるようにしてください。詳細については、効率性に関する考慮事項を参照してください。

非メンバー関数に複数のブレークポイントを設定する

多重定義された名前を持つ非メンバー関数 (同じ名前を持ち、引数の型または数の異なるもの) に複数のブレークポイントを設定するには、stop infunction コマンドを使用します。

たとえば、C++ プログラムで sort() という名前の 2 つのバージョンの関数が定義されていて、一方が int 型の引数、もう一方が float 型の引数を渡す場合、次のコマンドで、両方の関数にブレークポイントを配置します。

(dbx) stop infunction sort 

infunction イベントを指定する詳細については、infunction イベント指定を参照してください。

オブジェクトにブレークポイントを設定する

オブジェクト内ブレークポイントを設定し、特定のオブジェクトインスタンスに適用される操作をチェックします。

オブジェクト内ブレークポイントを使用して、特定のオブジェクトインスタンスで特定のメソッドが呼び出されたときに、プログラムの実行を停止します。たとえば、次のコードは f1->printit() が呼び出されたときにのみ stop を発生させます。

Foo *f1 = new Foo();
Foo *f2 = new Foo();
 f1->printit();
 f2->printit();

(dbx) stop inobject f1

f1 に格納されるアドレスはブレークポイントを配置したオブジェクトを示します。これは、f1 内のオブジェクトがインスタンス化された後にのみ、このブレークポイントを作成できることを示します。

デフォルトで、オブジェクト内ブレークポイントは、オブジェクトのクラス (継承されたクラスも含む) のすべての非静的メンバー関数でプログラムの実行を中断します。ブレークポイントをオブジェクトクラスのみに制限するには、-norecurse オプションを指定します。

オブジェクト foo のベースクラスで定義されたすべての非静的メンバー関数と、オブジェクト foo の継承クラスで定義されたすべての非静的メンバー関数にブレークポイントを設定するには、次のように入力します。

(dbx) stop inobject &foo

オブジェクト foo のクラスで定義されたすべての非静的メンバー関数にブレークポイントを設定するが、オブジェクト foo の継承クラスに定義されたものには設定しない場合:

(dbx) stop inobject &foo -norecurse

inobject イベントを指定する詳細については、inobject イベント指定および stop コマンドを参照してください。

データ変更ブレークポイント (ウォッチポイント) の設定

dbx でデータ変更ブレークポイント (またはウォッチポイントと呼ばれる) を使用して、変数の値または式が変更されたときに注意することができます。

特定アドレスへのアクセス時にプログラムを停止する

メモリーアドレスにアクセスされたときに実行を停止するには、stop access コマンドを使用します。

(dbx) stop access mode address-expression [, byte-size-expression]

mode はメモリーのアクセス方法を指定します。有効なオプションは:

r

指定したアドレスのメモリーが読み取られたことを示します。

w

メモリーへの書き込みが実行されたことを示します。

x

メモリーが実行されたことを示します。

さらに mode には、次のいずれかの文字も指定することができます。

a

アクセス後にプロセスを停止します (デフォルト)。

b

アクセス前にプロセスを停止します。

いずれの場合も、プログラムカウンタはアクセスしている命令をポイントします。「前」と「後」は副作用を指しています。

address-expression は、その評価によりアドレスを生成できる任意の式です。記号式を指定すると、監視対象領域のサイズが自動的に推定されます。byte-size-expression を指定して、それをオーバーライドすることができます。さらに、シンボルを使用しない、型を持たないアドレス式を使用することもできますが、その場合はサイズが必須です。

次の例では、コマンドはメモリーアドレス 0x4762 以降のいずれかの 4 バイトが読み取られたあとに実行を停止します。

(dbx) stop access r 0x4762, 4

次の例では、変数 speed に書き込みが行われる前に実行が停止します。

(dbx) stop access wb &speed

    stop access コマンドを使用する場合、次の点に注意してください。

  • 変数に同じ値が書き込まれてもイベントが発生します。

  • デフォルトにより、変数に書き込まれた命令の実行後にイベントが発生します。命令が実行される前にイベントを発生させるように指示するには、モードを b に指定します。

access イベントを指定する詳細については、access イベント指定および stop コマンドを参照してください。

変数の変更時にプログラムを停止する

指定した変数の値が変更された場合にプログラム実行を停止するには、stop change コマンドを使用します。

(dbx) stop change variable

    stop change コマンドを使用する場合は、次の点に注意してください。

  • dbx は、指定した変数の値に変更が発生した行の次の行でプログラムを停止します。

  • variable が関数に対しローカルである場合、関数が初めて入力されて variable の記憶領域が割り当てられた時点で、変数に変更が生じたものとみなされます。パラメータについても同じことが言えます。

  • このコマンドは、マルチスレッドのアプリケーションに対し機能しません。

change イベントを指定する詳細については、change イベント指定および stop コマンドを参照してください。

dbx は、自動シングルステップを実行しながら、各ステップで値をチェックして、stop change を実装します。ライブラリが -g オプションでコンパイルされていない場合、ステップ実行においてライブラリの呼び出しが省略されます。そのため、制御が次のように流れる場合、dbx はネストされた user_routine2 をトレースしません。トレースでは、ライブラリの呼び出しとネストされた user_routine2 の呼び出しがスキップされるためです。

   user_routine calls
      library_routine, which calls
        user_routine2, which changes variable

variable の値の変更は、user_routin2 が実行されている最中ではなく、ライブラリが呼び出しから戻ったあとに発生したように見えます。

dbx は、ブロック局所変数 ({} でネストされている変数) の変更に対しブレークポイントを設定できません。ネストされたブロック局所変数にブレークポイントまたはトレースを設定しようとすると、dbx はその操作を実行できない旨を通知するエラーメッセージを発行します。


注 -  change イベントよりも access イベントを使用した方が、データ変更の監視が高速になります。自動的にプログラムのシングルステップを実行する代わりに、access イベントはハードウェアまたはオペレーティングシステムのはるかに高速なサービスを利用します。

条件付きでプログラムを停止する

stop cond コマンドを使用して、 条件文が true に評価された場合にプログラム実行を停止します。

(dbx) stop cond condition

条件が発生すると、プログラムは実行を停止します。

    stop cond コマンドを使用する場合、次の点に注意してください。

  • dbx は、条件が true に評価された行の次の行でプログラムを停止します。

  • このコマンドは、マルチスレッドのアプリケーションに対し機能しません。

条件イベントを指定する詳細については、cond イベント指定および stop コマンドを参照してください。