Previous: , Up: GDB Graphical Interface   [Contents][Index]


27.6.5.8 マルチスレッドのデバッグ

GDBのall-stop modeでは、プログラムが停止すると、すべてのスレッドの実行が停止します。同様に、プログラムを再開すると、すべてのスレッドが実行を開始します。All-Stop Mode in The GNU debuggerを参照してください。マルチスレッド化されたいくつかのターゲットにたいして、GDBはこれを超える操作のためのモードをサポートします。これはnon-stop modeと呼ばれ、他のスレッドが自由に実行を継続している間に、デバッガーで停止したプログラムのスレッドを調べることができます。Non-Stop Mode in The GNU debuggerを参照してください。GDBのバージョン7.0以前では、non-stop modeはサポートされておらず、すべてのターゲットにたいしては機能しません。

変数gdb-non-stop-settingは、EmacsがGDBをall-stop modeとnon-stop modeのどちらで実行するかを決定します。デフォルトはtで、これは利用可能な場合はnon-stop modeを使うことを意味します。値をnilに変更した場合、またはnon-stop modeが利用不可の場合、EmacsはGDBをall-stop modeで実行します。この変数はEmacsがデバッグセッションを開始したときに効果をもちます。値を変更した場合、アクティブなデバッグセッションを再起動する必要があります。

non-stop modeモードでスレッドが停止すると、通常Emacsはそのスレッドに切り替えます。すでに選択したスレッドから停止した他のスレッドへの切り替えを行わないようにするには、変数gdb-switch-when-another-stoppednilに変更してください。

Emacsが停止したスレッドに切り替えるかどうかの決定は、そのスレッドが停止した理由に依存します。変数gdb-switch-reasonsをカスタマイズすることにより、スレッドの切り替えを行う停止理由を選択できます。

変数gdb-stopped-functionsには、あるスレッドが停止したときに実行する関数を指定できます。

non-stop modeでは、GUDの実行制御コマンドのための異なるモードを切り替えることができます。

Non-stop/A

gdb-gud-control-all-threadst(デフォルト)の場合、中断および継続のためのコマンドはすべてのスレッドに適用されるので、gud-stop-subjobまたはgud-contの1コマンドで、すべてのスレッドを停止または継続できます。少なくとも1つのスレッドが停止している場合、ツールバーに‘Go’ボタンが表示されます。また、少なくとも1つのスレッドが実行中の場合、‘Stop’ボタンが表示されます。

Non-stop/T

gdb-gud-control-all-threadsnilの場合、カレントスレッドだけを停止または継続します。GUDツールバーの‘Go’および‘Stop’のボタンの表示は、カレントスレッドの状態に依存します。

gdb-gud-control-all-threadsのカレント値は、ツールバーまたは‘GUD->GDB-MI’メニューで変更できます。

ステップコマンドは常にカレントスレッドに適用されます。

non-stop modeでは、スレッドを選択せずにスレッドを中断または継続できます。threadsバッファーで、ポイント位置のスレッドにたいしてiをタイプすると中断、cで継続、sでステップ実行します。今後さらにそのようなコマンドが追加されるかもしれません。

スレッドを中断した場合、停止理由は‘signal received’になることに注意してください。この理由がgdb-switch-reasonsに含まれている場合(デフォルトでは含まれています)、Emacsはそのスレッドに切り替えます。