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

印刷ビューの終了

更新: 2015 年 1 月
 
 

フィルタとマルチスレッド

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

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

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

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

event infinite loop causes missed events in the following handlers:
...
Event reentrancy
first event BPT(VID 6m TID 6, PC echo+0x8)
second event BPT*VID 10, TID 10, PC echo+0x8)
the following handlers will miss events:
...

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

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

    -resumeone 修飾子はすべての場合において問題を防ぐことはしません。たとえば、次の状況で役立つ場合があります。

  • 条件は再帰的に lookup() を呼び出すため、lookup() の 2 つ目のブレークポイントは最初のスレッドと同じスレッドで発生します。

  • 条件実行が別のスレッドへの制御を放棄するスレッド。

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