GDBの全停止モードでは、プログラムが停止するたびに、すべての実行スレッドが停止します。同様に、プログラムを再開するたびに、すべてのスレッドの実行が開始されます。The GNU debuggerの全停止モードを参照してください。一部のマルチスレッドターゲットでは、GDBは非停止モードと呼ばれるさらなる動作モードをサポートしており、このモードでは、他のスレッドが自由に実行を継続している間に、デバッガで停止したプログラムスレッドを調査できます。The GNU debuggerの非停止モードを参照してください。GDB 7.0より前のバージョンでは非停止モードはサポートされておらず、またすべてのターゲットで動作するわけではありません。
変数 gdb-non-stop-setting は、Emacs が GDB
を全停止モードで実行するか非停止モードで実行するかを決定します。デフォルトは t
で、これは非停止モードが利用可能な場合にそれを使用しようとすることを意味します。値を nil
に変更するか、非停止モードが利用できない場合、Emacs は GDB を全停止モードで実行します。この変数は Emacs
がデバッグセッションを開始する際に有効になります。値を変更した場合は、実行中のデバッグセッションを再起動してください。
ノンストップモードでスレッドが停止すると、通常 Emacs はそのスレッドに切り替えます。すでに別の停止中のスレッドが選択されている場合に Emacs
にこの切り替えを行わせたくない場合は、変数 gdb-switch-when-another-stopped を nil に変更してください。
Emacsは、停止の原因に応じて、停止したスレッドに切り替えるかどうかを判断できます。変数 gdb-switch-reasons
をカスタマイズして、スレッド切り替えのトリガーとなる停止理由を選択してください。
変数 gdb-stopped-functions
を使用すると、いずれかのスレッドが停止した際に関数を実行できます。
ノンストップモードでは、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」メニューから変更できます。
ステップコマンドは常に現在のスレッドに適用されます。
ノンストップモードでは、スレッドを選択することなく、中断や続行が可能です。スレッドバッファで i を押すとポイント位置のスレッドが中断され、c で続行、s でステップ実行されます。今後、このようなコマンドがさらに追加される可能性があります。
なお、スレッドを中断すると、‘signal received’
という理由で停止します。この理由が gdb-switch-reasons
に含まれている場合(デフォルトでは含まれています)、Emacs はそのスレッドに切り替えます。