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 スレッド番号 コマンド