web-dev-qa-db-ja.com

GDBでマルチスレッドプログラムをデバッグするときに、一度に1つのスレッドを継続する方法は?

2つのスレッドを使用するプログラムがあります。両方のスレッドにブレークポイントを設定しました。 gdbでプログラムを実行しているときに、スレッドを切り替えて実行したいと考えています。 (スレッドt1はアクティブで実行中であり、スレッドt2です。ブレークポイントで一時停止すると、T1の実行を停止してT2を実行したいと思います)。

Gdbでスレッドをスケジュールする方法はありますか?

34
Arpit

GDB 7以降を使用している場合は、「ノンストップモード」を試してください。

http://sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html

前述の「scheduler-locking on」コマンドを使用すると、1つのスレッドを停止し、他のスレッドを停止できます。ノンストップモードでは、他のスレッドをアクティブにして1つのスレッドをステップ実行できます。

8
PFee

デフォルトでは、GDBはブレークポイントに到達するとすべてのスレッドを停止し、コマンド(continuenextstepfinishなど)。これは、下位プロセス(デバッグ中のプロセス)が実行を開始することを要求します。

ただし、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下位プロセスを自己デッドロックさせるのは非常に簡単です。

46

ブレーク条件を使用する

(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ファイル内に配置できます。

1
fabrizioM