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-stopped
をnil
に変更してください。
Emacsが停止したスレッドに切り替えるかどうかの決定は、そのスレッドが停止した理由に依存します。変数gdb-switch-reasons
をカスタマイズすることにより、スレッドの切り替えを行う停止理由を選択できます。
変数gdb-stopped-functions
には、あるスレッドが停止したときに実行する関数を指定できます。
non-stop modeでは、GUDの実行制御コマンドのための異なるモードを切り替えることができます。
gdb-gud-control-all-threads
がt
(デフォルト)の場合、中断および継続のためのコマンドはすべてのスレッドに適用されるので、gud-stop-subjob
またはgud-cont
の1コマンドで、すべてのスレッドを停止または継続できます。少なくとも1つのスレッドが停止している場合、ツールバーに‘Go’ボタンが表示されます。また、少なくとも1つのスレッドが実行中の場合、‘Stop’ボタンが表示されます。
gdb-gud-control-all-threads
がnil
の場合、カレントスレッドだけを停止または継続します。GUDツールバーの‘Go’および‘Stop’のボタンの表示は、カレントスレッドの状態に依存します。
gdb-gud-control-all-threads
のカレント値は、ツールバーまたは‘GUD->GDB-MI’メニューで変更できます。
ステップコマンドは常にカレントスレッドに適用されます。
non-stop modeでは、スレッドを選択せずにスレッドを中断または継続できます。threadsバッファーで、ポイント位置のスレッドにたいしてiをタイプすると中断、cで継続、sでステップ実行します。今後さらにそのようなコマンドが追加されるかもしれません。
スレッドを中断した場合、停止理由は‘signal
received’になることに注意してください。この理由がgdb-switch-reasons
に含まれている場合(デフォルトでは含まれています)、Emacsはそのスレッドに切り替えます。