Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

スレッド作成動作について

次の例に示すように、アプリケーションが thr_create イベントおよび thr_exit イベントを使用して、どれくらい頻繁にスレッドを作成および終了しているかを知ることができます。


(dbx) trace thr_create
(dbx) trace thr_exit
(dbx) run

trace: thread created t@2 on l@2
trace: thread created t@3 on l@3
trace: thread created t@4 on l@4
trace: thr_exit t@4
trace: thr_exit t@3
trace: thr_exit t@2

ここでは、アプリケーションが 3 つのスレッドを作成します。スレッドは作成されたのとは逆の順序で終了し、アプリケーションにそれ以上のスレッドがある場合は、スレッドが累積されてリソースを消費します。

有用な情報を得るため、別のセッションで次のコマンドを実行してみてください。


(dbx) when thr_create { echo "XXX thread $newthread created by $thread"; }
XXX thread t@2 created by t@1
XXX thread t@3 created by t@1
XXX thread t@4 created by t@1

出力を見ると、3 つのスレッドすべてがスレッド t@1 によって作成されていることがわかります。これは、一般的なマルチスレッド化のパターンです。

スレッド t@3 を、その出力セットからデバッグする場合を考えます。次のようにすると、スレッド t@3 が作成されたポイントでアプリケーションを停止できます。


(dbx) stop thr_create t@3
(dbx) run
t@1 (l@1) stopped in tdb_event_create at 0xff38409c
0xff38409c: tdb_event_create       :    retl
Current function is main
216       stat = (int) thr_create(NULL, 0, consumer, q, tflags, &tid_cons2);
(dbx)

アプリケーションで新しいスレッドが発生しますが、それがスレッド t@1 ではなくスレッド t@5 から発生することがある場合は、次のようにするとそのイベントを獲得できます。


(dbx) stop thr_create -thread t@5