C言語 - GDB - スレッドのデバッグ

 
1. 参考にしたサイト
2. スレッドのデバッグを有効にする
3. スレッドの状態を調べる
4. 実行中のスレッドを切り替える
5. 他のスレッドにコマンドを送る

1. 参考にしたサイト

 メモする内容は表題の通りで、以下のサイトを参考にさせていただきました。
RED HAT 個別スレッドのデバッグ」
「gdbでのマルチスレッド処理のデバッグや制御について

2. スレッドのデバッグを有効にする

 おまじないくらいにしか理解していませんが、gdb の起動後に下の2行のコマンドを入力します。

> gdb ロードモジュール名
GNU gdb (GDB) Red Hat Enterprise Linux (...)

		~ 略 ~

For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from ロードモジュール名...done.
(gdb) set non-stop on
(gdb) set target-async on
 これ

~/.gdbinit
 に

set non-stop on
set target-async on
 と記述しておけば、GDB の起動のたびに打たなくても有効になります。

3. スレッドの状態を調べる

 デバッグ中に info thread (inf th まで省略可) を入力することで現在のスレッドの状態を調べることができます。  スレッドがひとつの状態だと

(gdb) info thread
* 1 Thread 0x7ffff28e1720 (LWP 3285)  関数名 (引数) at ソースファイル名:行番号
 スレッドがふたつになると

(gdb) info thread
  2 Thread 0x7ffff28df700 (LWP 3311)  関数名2 (引数2) at ソースファイル名2:行番号2
* 1 Thread 0x7ffff28e1720 (LWP 3285)  関数名1 (引数1) at ソースファイル名1:行番号1
 となります。  先頭の数字はスレッド番号で、「*」は現在デバッグ中のスレッドを意味します。

4. 実行中のスレッドを切り替える

 前項の info thread でも現在実行中のスレッドを見ることができますが単に thread で

(gdb) thread
[Current thread is 1 (Thread 0x7ffff28e1720 (LWP 3315))]
 と実行中のスレッドの番号を見ることができます。  デバッグ対象のスレッドを切り替えるには「thread スレッド番号」と入力します。

(gdb) thread 2
[Switching to thread 2 (Thread 0x7ffff28df700 (LWP 3342))]#0  関数名 (引数) at ソースファイル名:行番号
行番号 ソースのテキスト

5. 他のスレッドにコマンドを送る

 thread apply というコマンドを使用して他のスレッドを操作できます。

(gdb) thread apply スレッド番号 コマンド