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

印刷ビューの終了

更新: 2015 年 1 月
 
 

呼び出し元フィルタによるブレークポイントの修飾

経験の少ないユーザーは、条件付きイベントコマンド (ウォッチタイプのコマンド) の設定と、フィルタの使用を混同することがあります。概念的には、watch タイプのコマンドは、各行の実行前に検査される「前提条件」を作成します (watch のスコープ内で)。ただし、条件付トリガーのあるブレークポイントコマンドでも、それに接続するフィルタを持つことができます。

次の例を考慮します。

(dbx) stop access w &speed -if speed==fast_enough

このコマンドは、変数 speed をモニターするように dbx に指示します。変数 speed に書き込みが行われると (「ウォッチ」部分)、-if フィルタが有効になります。dbxspeed の新しい値が fast_enough と等しいかどうかをチェックします。等しくない場合、プログラムは実行を継続し、stop を「無視」します。

dbx 構文では、フィルタはブレークの「事後」、構文の最後で [-if condition] 文の形式で指定されます。

stop in function [-if condition]

次のようなコードのある類似の例を考慮します。

44:     if(open(filename, ...) == -1)
45:          return "Error";

次のコマンドによって、open()ENOENT などの特定のエラーで停止できます。

(dbx) stop at 45 -if errno == 2

局所変数にデータ変更ブレークポイントを配置する際に、フィルタを使用すると便利です。次の例では、現在のスコープは関数 foo() 内にあり、対象となる変数 index は関数 bar() 内にあります。

(dbx) stop access w &bar`index -in bar

bar`index により、関数 foo にある index() 変数や index という名称のグローバル変数ではなく、関数 bar にある index 変数が確実に取り出されます。

    -in bar には、次のような意味があります。

  • 関数 bar() に入ると、ブレークポイントが自動的に有効になります。

  • bar() とそれが呼び出したすべての関数が有効の間は、ブレークポイントは有効の状態を保つ。

  • bar() からの復帰時に、ブレークポイントは自動的に無効になります。

index に対応するスタック位置は、ほかのいずれかの関数のいずれかの局所変数によって再度利用できます。-in により、ブレークポイントが起動するのは bar`index がアクセスされた場合のみになります。