ブレークポイントで動作するコマンドには次の 3 種類があります。
stop ブレークポイント |
stop コマンドによって作成されたブレークポイントに到達すると、プログラムは停止します。停止したプログラムはほかの dbx コマンドを実行するまで再開されません。 |
when ブレークポイント |
プログラムは停止し、dbx が 1 つまたは複数の dbx コマンドを実行した後、プログラムは再開します。プログラムは、コマンドの中に stop が含まれていない限り処理を続けます。 |
trace ブレークポイント |
プログラムは停止し、イベント固有のトレース情報行を出力した後、プログラムは再開します。 |
dbx の stop at コマンドを使用して、行番号にブレークポイントを設定できます。
(dbx) stop at filename: n
ここで、n はソースコードの行番号、filename はそのコードが含まれているソースファイルの名前 (省略可能) です。たとえば、次のようにします。
(dbx) stop at main.cc:3
stop または when コマンドに指定された行が、ソースコードの実行可能行ではない場合、dbx は次の有効な実行可能行にブレークポイントを設定します。
when タイプのブレークポイントは、ほかの dbx コマンドを副作用コマンドとして利用できます。たとえば、when で list コマンドを副作用コマンドとして用いれば、独自のトレースを実現することができます。
(dbx) when at 123 { list $lineno;}
when は cont コマンドを暗黙指定して動作します。上の例の場合、現在行のコードを出力した後、プログラムの実行が続けられます。
実行時リンカーとの間でプログラムインタフェースを使用するコード、すなわち dlopen()、dlclose()、およびそれらに関連する関数を呼び出すコードをデバッグするときは、dbx の全機能を利用できます。実行時リンカーは、プログラムの実行中に共有ライブラリをリンクしたり、そのリンクを解除したりします。dlopen() と dlclose() のサポートにより、動的にリンクされている共有ライブラリの関数もプログラムの起動時にリンクされたライブラリの関数と同様に、ステップ実行したり、ブレークポイントを設定したりできます。
例外が 3 つあります。
dlopen ( ) によって読み込まれるライブラリには、そのライブラリが dlopen ( ) によって読み込まれる前にブレークポイントを設定することはできません。
dlopen ( ) によって読み込まれたフィルタライブラリには、その中の最初の関数が呼び出されるまでブレークポイントを設定することはできません。
ライブラリが dlopen() によって読み込まれるとき、_init() という名前の初期化ルーチンが呼び出されます。このルーチンは、ライブラリ内のほかのルーチンを呼び出すことがあります。この初期化が終わるまで、dbx は読み込まれたライブラリにブレークポイントを置くことができません。dlopen() によって読み込まれたライブラリの _init()内で dbx を停止させることはできません。
異なるクラスのメンバー関数の呼び出し、特定のクラスのすべてのメンバー関数の呼び出し、または多重定義されたトップレベル関数の呼び出しに関連する問題が発生する可能性があります。このような場合に対処するために、inmember、inclass、infunction または inobject のキーワードのうちの 1 つを stop, when,または trace コマンドとともに使用することにより、1 回のコマンドで C++ コードに複数のブレークポイントを挿入できます。
特定のメンバー関数のオブジェクト固有のもの (同じメンバー関数名でクラスの異なるもの) それぞれにブレークポイントを設定するには、stop inmember を使用します。
when ブレークポイントを設定するには、when コマンドをキーワード inmember とともに使用します。
たとえば、関数 draw が複数の異なるクラスに定義されている場合は、それぞれの関数ごとにブレークポイントを設定します。
(dbx) stop inmember draw
特定のクラスのすべてのメンバー関数にブレークポイントを設定するには、stop inclass コマンドを使用します。
when タイプのブレークポイントを設定する場合は、when コマンドをキーワード inclass とともに使用します。
クラス wedge のすべてのメンバー関数にブレークポイントを設定するには、次のように入力します。
(dbx) stop inclass wedge
ブレークポイントは、該当するクラスで定義されているクラスメンバー関数にだけ挿入されます。基底クラスから継承された関数には挿入されません。
stop inclass やほかのブレークポイントの選択によって挿入される多数のブレークポイントがあるため、必ず dbxenv step_events を on に設定して、step と next の速度を上げる必要があります。
多重定義された名前を持つ非メンバー関数 (同じ名前を持ち、引数の型または数の異なるもの) に複数のブレークポイントを設定するには、stop infunction コマンドを使用します。
when タイプのブレークポイントを設定する場合は、when コマンドをキーワード infunction とともに使用します。
たとえば、C++ プログラムで sort() という名前の関数が 2 種類定義されていて、一方が int 型の引数、もう一方が float 型の引数をとる場合に、両方の関数にブレークポイントを置くためには、次のように入力します。
(dbx) when infunction sort {cmd;}
In Object ブレークポイントを設定して、特定オブジェクトに適用される演算を確認します。In Object ブレークポイントは、オブジェクトから呼び出されると、そのオブジェクトクラスのすべての非静的メンバー関数によるプログラムの実行を中断します。
オブジェクトにブレークポイントを設定するには、stop inobject コマンドを使用します。
(dbx) stop inobject foo