例: スレッド A はスレッド B を作成します。スレッド B の作成を開始するときにスレッド A をブロックしたいのですが、GDB でそれを行う方法がわかりません。どんな助けでも大歓迎です!ありがとう
質問する
402 次
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 に答える