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

audiobook.jp
earthcar(アースカー)
健康サポート特集
損保との違い
5G CONNECT
TikTok Shop 【リピート用プログラム】
アフィリエイトのアクセストレード
葬送のフリーレン Prime Video
サウンドハウス
EaseUS
薬屋の独り言
ベルリッツ
ハイスピードプラン
ネットオークションの相場、統計、価格比較といえばオークファン
JETBOY
Amazonギフトカード
【usus ウズウズ】
それがだいじWi-Fi
U-NEXT