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

印刷ビューの終了

更新: 2015 年 1 月
 
 

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 コマンドを参照してください。