2

例: スレッド A はスレッド B を作成します。スレッド B の作成を開始するときにスレッド A をブロックしたいのですが、GDB でそれを行う方法がわかりません。どんな助けでも大歓迎です!ありがとう

4

1 に答える 1

1

GDB ノンストップ モードを使用し、プログラムが pthread_create() を呼び出した後の行にブレークポイントを配置します。

bad_thread からシンボルを読み取っています...完了。
(gdb) ターゲット非同期 1 を設定
(gdb) ページネーションをオフに設定
(gdb) ノンストップをオンに設定
(gdb) b pthread_create
0x400570 のブレークポイント 1
(gdb) r
プログラムの開始: bad_thread
【libthread_dbを有効にしたスレッドデバッグ】

pthread_create@plt () のブレークポイント 1、0x0000000000400570
(gdb) ところで
#0 0x0000000000400570 in pthread_create@plt ()
#1 main () の 0x00000000004006d8 at bad_thread.c:21
(gdb) リスト   
12 pthread_mutex_unlock(&x_mutex);
13
14 pthread_exit(NULL);
15 }
16
17 整数
18 メイン () {
19 pthread_t tid1、tid2;
20
21 pthread_create(&tid1, NULL, add_thread, NULL);
(gdb) b bad_thread.c:22
0x4006d8 のブレークポイント 2: ファイル bad_thread.c、22 行目。
(gdb) b add_thread
0x400694 のブレークポイント 3: ファイル bad_thread.c、10 行目。
(gdb)c
つづく。
[新しいスレッド 0x40a00960 (LWP 26829)]

ブレークポイント 2、main ()、bad_thread.c:22
22 pthread_create(&tid2, NULL, add_thread, NULL);
(gdb)
ブレークポイント 3、add_thread (arg=0x0) at bad_thread.c:10
10 pthread_mutex_lock(&x_mutex);
bt
#0 main () at bad_thread.c:22
(gdb)

上記を説明するには:

  • GDB ドキュメントに従ってノンストップ モードをオンにする
  • pthread_create() にブレークポイントを配置して、プログラムがこれを呼び出す場所を決定します
  • 実行してブレークポイントに到達
  • コードの次の行を見つけるためのバックトレースとリスト
  • コードの次の行とスレッド開始関数 (この場合は add_thread) にブレークポイントを配置します。
  • 走る
  • 元のスレッドの次のコード行でブレークポイントに到達していることに注意してください。新しいスレッドはバックグラウンドで続行され、スレッド開始関数でブレークポイントにヒットします。
于 2013-11-14T16:52:04.177 に答える