Sun Studio 12: dbx コマンドによるデバッグ

関数の戻り値をフィルタとして使用

関数呼び出しをブレークポイントフィルタとして使用できます。次の例では、文字列 str の値が abcde の場合、プログラムが関数 foo() で停止します。


(dbx) stop in foo -if !strcmp("abcde",str)

変数スコープをフィルタとして使用

ブレークポイントフィルタの設定に変数スコープを使用できます。この例で、現在のスコープは関数 foo() にあり、localmain() で定義された局所変数です。


(dbx) stop access w &main`local -if pr(main`local) -in main

条件付イベントでのフィルタの使用

最初のうちは、条件付イベントコマンド (watch タイプのコマンド) の設定と、フィルタの使用とを混同してしまうかもしれません。概念的には、watch タイプのコマンドは、各行の実行前に検査される「前提条件」を作成します (watch のスコープ内で)。ただし、条件付トリガーのあるブレークポイントコマンドでも、それに接続するフィルタを持つことができます。

次に具体的な例を示します。


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

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

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


stop in function [-if condition]

マルチスレッドプログラムでブレークポイントに関数呼び出しを含むフィルタを設定すると、dbx がブレークポイントに達するとすべてのスレッドの実行が停止し、条件が評価されます。条件が合致して関数が呼び出されると、dbx がその呼び出し中すべてのスレッドを再開します。

たとえば、次のブレークポイントを、多くのスレッドが lookup() を呼び出すマルチスレッドアプリケーションで設定する場合があります。


(dbx) stop in lookup -if strcmp(name, "troublesome") == 0

dbx は、スレッド t@1 lookup() を呼び出して条件を評価すると停止し、strcmp() を呼び出してすべてのスレッドを再開します。dbx が関数呼び出し中に別のスレッドでブレークポイントに達すると、次のいずれかの警告が表示されます。


イベント無限ループにより次のハンドラ中でイベントの取りこぼしが起きます。
...

イベントの再入
最初のイベント BPT(VID 6m TID 6, PC echo+0x8)
2 番目のイベント BPT*VID 10, TID 10, PC echo+0x8)
以下のハンドラはイベントを処理しません:
...

そのような場合、条件式内で呼び出された関数が mutex を取得しないことを確認できる場合は、-resumeone イベント指定修飾子を使用して、dbx がブレークポイントに達した最初のスレッドのみを再開させることができます。たとえば、次のブレークポイントを設定する場合があります。


(dbx) stop in lookup -resumeone -if strcmp(name, "troublesome") == 0

-resumeone 修飾子はすべての場合において問題を防ぐことはしません。たとえば、次の場合にも何も行いません。

イベント修飾子の詳細については、「イベント指定のための修飾子」を参照してください。