8. C言語/GDB でスレッドのデバッグを行う

 
8.1 参考にしたサイト
8.2 スレッドのデバッグを有効にする
8.3 スレッドの状態を調べる
8.4 実行中のスレッドを切り替える
8.5 他のスレッドにコマンドを送る

8.1 参考にしたサイト

 メモする内容は表題の通りで、以下のサイトを参考にさせていただきました。


8.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 の起動のたびに打たなくても有効になります。

8.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

 となります。
 先頭の数字はスレッド番号で、「*」は現在デバッグ中のスレッドを意味します。

8.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 ソースファイル名:行番号
行番号 ソースのテキスト

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

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