0

gdbの詳細は何ですか?コードをデバッグするときに1つのスレッドを保持しますか?

メインスレッドに終了フラグを設定し、フラグを出力する前に他のスレッドに参加しました。引数「-g」を使用してコンパイルした後、gdbを使用してデバッグバージョンを実行すると、次のようになります。

[Thread debugging using libthread_db enabled]
Input number of threads:5

Main thread id: 0xb7fda6c0, 
[New Thread 0xb7fd9b70 (LWP 9276)]
[New Thread 0xb75d8b70 (LWP 9277)]
[New Thread 0xb6bd7b70 (LWP 9278)]
[New Thread 0xb61d6b70 (LWP 9279)]
[New Thread 0xb57d5b70 (LWP 9280)]
I am thread 0xb6bd7b70, myorder 2, thread_exit.
I am thread 0xb61d6b70, myorder 3, thread_exit.
I am thread 0xb7fd9b70, myorder 0, thread_exit.
I am thread 0xb57d5b70, myorder 4, thread_exit.
I am thread 0xb75d8b70, myorder 1, thread_exit.
[Thread 0xb61d6b70 (LWP 9279) exited]
[Thread 0xb6bd7b70 (LWP 9278) exited]
[Thread 0xb75d8b70 (LWP 9277) exited]
[Thread 0xb7fd9b70 (LWP 9276) exited]
Main: completed join with thread 0xb7fd9b70 having a status of 0
Main: completed join with thread 0xb75d8b70 having a status of 1
Main: completed join with thread 0xb6bd7b70 having a status of 2
Main: completed join with thread 0xb61d6b70 having a status of 3
Main: completed join with thread 0xb57d5b70 having a status of 4
Main: lock will be destroy
Main: 9273, tlist will be free 
Main exit.
[Thread 0xb57d5b70 (LWP 9280) exited]

Program exited normally.
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6.i686 libgcc-4.4.4-13.el6.i686

GDBは、スレッドの「作成」と「終了」に関する情報を提供します。pthread_join()ただし、メインスレッドで「メイン出口」を呼び出して出力した後は、常に1つのスレッドが終了します。なんで?gdbが動作するスレッドはありますか?

リリース版を実行します。特別なことは何もありません。

Input number of threads:5

Main thread id: 0xb77176c0, 
I am thread 0xb5913b70, myorder 3, thread_exit.
I am thread 0xb4f12b70, myorder 4, thread_exit.
I am thread 0xb6314b70, myorder 2, thread_exit.
I am thread 0xb6d15b70, myorder 1, thread_exit.
I am thread 0xb7716b70, myorder 0, thread_exit.
Main: completed join with thread 0xb7716b70 having a status of 0
Main: completed join with thread 0xb6d15b70 having a status of 1
Main: completed join with thread 0xb6314b70 having a status of 2
Main: completed join with thread 0xb5913b70 having a status of 3
Main: completed join with thread 0xb4f12b70 having a status of 4
Main: lock will be destroy
Main: tdata list will be free 
Main exit.
4

1 に答える 1

4

gdb、デバッグコード時に1つのスレッドを保持しますか?

いいえ。

pthread_join()を呼び出し、メインスレッドで「メイン出口」を出力した後、常に1つのスレッドが終了します。なんで?

スレッドが終了したことを通知するためにglibcがGDBに送信する通知は、スレッドが(ほぼ)最後に行うこととして送信されます。特に、その通知は、終了スレッドがメインスレッドに終了したことを通知した後(つまり、終了スレッドがメインスレッドをウェイクアップした後)に送信されます。Main exitしたがって、 GDBが終了スレッドが実際に終了したことに気付く前に、メインスレッドがウェイクアップして印刷することはまったく驚くべきことではありません。

私は何度もそれを実行しました、毎回「メイン出口」の後に1つのスレッドしかありません。

それは何も証明しません。プログラムを1,000,000回実行すると、印刷される前にGDBがスレッドの終了に気付く実行が少なくとも1回は発生する可能性があります。Main exit順序は、システムに搭載されているプロセッサの数と、それらがどれだけビジーであるかに依存する可能性があります。ここで見るものは本当に何もありません(興味深い)。

于 2012-07-13T18:45:13.337 に答える