プログラムの実行を再開するには、cont コマンドを使用します。プログラム現在、スレッドは同期ブレークポイントを使用して、すべてのスレッドが実行を再開するようにしています。
ただし、シングルスレッドは、call コマンドに -resumeone オプションを付けて使用することにより再開できます (「call コマンド」を参照)。
多数のスレッドが関数 lookup() を呼び出すマルチスレッドアプリケーションをデバッグする場合の 2 つのシナリオを次に示します。
条件付きブレークポイントを設定します。
stop in lookup -if strcmp(name, "troublesome") == 0 |
t@1 が lookup() の呼び出しで停止すると、 dbx は条件の評価を試み、strcmp() を呼び出します。
ブレークポイントを設定します。
stop in lookup |
t@1 が lookup() の呼び出しで停止したら、次のコマンドを発行します。
call strcmp(name, "troublesome") |
strcmp() を呼び出すと、dbx は呼び出しの間、すべてのスレッドを再開することがありますが、これは dbx の動作 (next コマンドを使用して、シングルステップ実行をする場合) に似ています。この動作は、t@1 のみを再開すると、strcmp() が別のスレッドによって所有されているロックを奪取しようと試みた場合に、デッドロックが発生する可能性があるためです。
この場合にすべてのスレッドを再開することの欠点は、strcmp() の呼び出し中に lookup() のブレークポイントにヒットして、dbx が t@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 つ目のブレークポイントが発生した場合
条件を実行するスレッドが生成するか、スリープさせるか、または何らかの方法で、別のスレッドに制御を放棄する場合