2つのスレッドを使用するプログラムがあります。両方のスレッドにブレークポイントを設定しました。 gdbでプログラムを実行しているときに、スレッドを切り替えて実行したいと考えています。 (スレッドt1はアクティブで実行中であり、スレッドt2です。ブレークポイントで一時停止すると、T1の実行を停止してT2を実行したいと思います)。
Gdbでスレッドをスケジュールする方法はありますか?
GDB 7以降を使用している場合は、「ノンストップモード」を試してください。
http://sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html
前述の「scheduler-locking on」コマンドを使用すると、1つのスレッドを停止し、他のスレッドを停止できます。ノンストップモードでは、他のスレッドをアクティブにして1つのスレッドをステップ実行できます。
デフォルトでは、GDBはブレークポイントに到達するとすべてのスレッドを停止し、コマンド(continue
、next
、step
、finish
など)。これは、下位プロセス(デバッグ中のプロセス)が実行を開始することを要求します。
ただし、GDBにそれを行わないように指示できます。
(gdb) help set scheduler-locking
Set mode for locking scheduler during execution.
off == no locking (threads may preempt at any time)
on == full locking (no thread except the current thread may run)
step == scheduler locked during every single-step operation.
In this mode, no other thread may run during a step command.
Other threads may run while stepping over a function call ('next').
したがって、ブレークポイントを設定してから、set scheduler-locking on
、次にスレッド1でcontinue
またはfinish
(スレッド2はまだ停止しています)、次にCtrl-CでGDBの制御を取り戻し、スレッド2に切り替えますcontinue
(スレッド1はまだ停止しています)など。
注意:scheduler-locking on
下位プロセスを自己デッドロックさせるのは非常に簡単です。
ブレーク条件を使用する
(gdb) break frik.c:13 thread 28 if bartab > lim
参照 GDBを使用したデバッグ
編集:
(gdb) break <thread_function_entry_point> thread 2
(gdb) break <thread_function_entry_point> thread 1
(gdb) thread 1
(gdb) continue
(gdb) ... thread 1 finishes
(gdb) thread 2
(gdb) continue
これらのコマンドは.gdbrcファイル内に配置できます。