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

印刷ビューの終了

更新: 2015 年 1 月
 
 

実行の再開

プログラムの実行を再開するには cont コマンドを使用します。 現在、スレッドは同期ブレークポイントを使用して、すべてのスレッドが実行を再開するようにしています。ただし、–resumeone オプションを指定して call コマンドを使用することにより、1 つのスレッドを再開できます。

    多数のスレッドが関数 lookup() を呼び出すマルチスレッドアプリケーションをデバッグする場合の 2 つのシナリオを次に示します。

  • 条件付きブレークポイントを設定します。

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

    t@1lookup() の呼び出しで停止すると、dbx は条件の評価を試みたあと、strcmp() を呼び出します。

  • ブレークポイントを設定します。

    stop in lookup

    t@1lookup() の呼び出しで停止したら、次のコマンドを発行します。

    call strcmp(name, "troublesome")

strcmp() を呼び出すときに、dbx は呼び出しの間、すべてのスレッドを再開します。これは、next コマンドでシングルステップを実行しているときの dbx の動作に似ています。この動作は、t@1 のみを再開すると、strcmp() が別のスレッドによって所有されているロックを奪取しようと試みた場合に、デッドロックが発生する可能性があるためです。

この場合にすべてのスレッドを再開することの欠点は、strcmp() の呼び出し中に lookup() のブレークポイントにヒットして、dbxt@2 などのほかのスレッドを処理できないことです。次のような警告が表示されます。

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

イベントの再入 第 1 イベント BPT(VID 6、TID 6、PC echo+0x8) 第 2 イベント BPT(VID 10、TID 10、PC echo+0x8) 以下のハンドラはイベントを処理しません。

このような場合、条件式で呼び出された関数が相互排他ロックを取得しないことが確実であれば、-resumeone イベント修飾子を使用して、dbx に強制的に t@1 のみを再開させることができます。

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

strcmp() を評価するために、lookup() のブレークポイントをヒットしたスレッドのみが再開されます。

    この方法は、次の例のような場合には役立ちません。

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

  • 条件を実行するスレッドが生成するか、スリープさせるか、または何らかの方法で、別のスレッドに制御を放棄する場合