dbx コマンドによるデバッグ

ブレークポイントを設定する

ブレークポイントで動作するコマンドには次の 3 種類があります。

stop ブレークポイント

stop コマンドによって作成されたブレークポイントに到達すると、プログラムは停止します。停止したプログラムはほかの dbx コマンドを実行するまで再開されません。

when ブレークポイント

プログラムは停止し、dbx が 1 つまたは複数の dbx コマンドを実行した後、プログラムは再開します。プログラムは、コマンドの中に stop が含まれていない限り処理を続けます。

trace ブレークポイント

プログラムは停止し、イベント固有のトレース情報行を出力した後、プログラムは再開します。 

ソースコードの特定の行に stop ブレークポイントを設定する

dbxstop at コマンドを使用して、行番号にブレークポイントを設定できます。


(dbx) stop at filename: n

ここで、n はソースコードの行番号、filename はそのコードが含まれているソースファイルの名前 (省略可能) です。たとえば、次のようにします。


(dbx) stop at main.cc:3

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

特定の行に when タイプのブレークポイントを設定する

when タイプのブレークポイントは、ほかの dbx コマンドを副作用コマンドとして利用できます。たとえば、whenlist コマンドを副作用コマンドとして用いれば、独自のトレースを実現することができます。


(dbx) when at 123 { list $lineno;}

whencont コマンドを暗黙指定して動作します。上の例の場合、現在行のコードを出力した後、プログラムの実行が続けられます。

動的にリンクされたライブラリにブレークポイントを設定する

実行時リンカーとの間でプログラムインタフェースを使用するコード、すなわち dlopen()dlclose()、およびそれらに関連する関数を呼び出すコードをデバッグするときは、dbx の全機能を利用できます。実行時リンカーは、プログラムの実行中に共有ライブラリをリンクしたり、そのリンクを解除したりします。dlopen()dlclose() のサポートにより、動的にリンクされている共有ライブラリの関数もプログラムの起動時にリンクされたライブラリの関数と同様に、ステップ実行したり、ブレークポイントを設定したりできます。

例外が 3 つあります。

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

異なるクラスのメンバー関数の呼び出し、特定のクラスのすべてのメンバー関数の呼び出し、または多重定義されたトップレベル関数の呼び出しに関連する問題が発生する可能性があります。このような場合に対処するために、inmemberinclassinfunction または 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_eventson に設定して、stepnext の速度を上げる必要があります。

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

多重定義された名前を持つ非メンバー関数 (同じ名前を持ち、引数の型または数の異なるもの) に複数のブレークポイントを設定するには、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