dbx コマンドによるデバッグ |
第 12 章
マルチスレッドアプリケーションのデバッグ
dbx
では Solaris スレッドや POSIX スレッドを使用するマルチスレッドアプリケーションをデバッグできます。dbx
には、各スレッドのスタックトレースの確認、全スレッドの再実行、特定のスレッドに対するstep
やnext
の実行、スレッド間の移動をする機能があります。
dbx
は、libthread.so
が使用されているかどうかを検出することによって、マルチスレッドプログラムかどうかを認識します。プログラムは、-lthread
または-mt
を使用してコンパイルすることによって明示的に、あるいは-lpthread
を使用してコンパイルすることによって暗黙的にlibthread.so
を使用します。この章では、
dbx
のthread
コマンドを使用して、スレッドに関する情報を入手したり、デバッグを行う方法について説明します。マルチスレッドデバッグについて
dbx
は、マルチスレッドプログラムを検出すると、libthread_db.so
のdlopen
を試行します。これは、/usr/lib
にあるスレッドデバッグ用の特別なシステムライブラリです。
dbx
は同期的に動作します。つまり、スレッドか軽量プロセス (LWP) のいずれかが停止すると、ほかのスレッドおよび LWP もすべて自動的に停止します。この動作は、「世界停止」モデルと呼ばれる場合があります。
注 - マルチスレッドプログラミングと LWP については、『Solaris マルチスレッドのプログラミング』を」参照してください。
スレッド情報
*
(アスタリスク) は、ユーザーの注意を必要とするイベントがこのスレッドで起こったことを示します。通常は、ブレークポイントに付けられます。- > (矢印) は現在のスレッドを示します。
t@
num はスレッド ID であり、特定のスレッドを指します。number は、thr_create
によって返されたthread_t
の値になります。- b l@num はそのスレッドが指定の LWP に結合されていることを表し、a l@num はそのスレッドがアクティブであることを表します。すなわちそのスレッドはオペレーティングシステムにて実行可能です。
thr_create
に渡されたスレッドの開始関数。?()
は開始関数が不明であることを示します。- スレッドの状態。(スレッドの状態については、表 12-1 参照)。
- スレッドが現在実行している関数。
別のスレッドのコンテキストの表示
表示コンテキストを別のスレッドに切り替えるには、
thread
コマンドを使用します。この構文は次のとおりです。
thread [-info] [-hide] [-unhide] [-suspend] [-resume]
tid
thread
thread tid
thread
コマンドの詳細については、Sun WorkShop オンラインヘルプの「 dbx コマンドの使い方」の「thread コマンド」を参照してください。スレッドリストの表示
次のコマンドは、
threads
リストを表示するためのものです。構文は次のとおりです。
threads [-all] [-mode [all|filter] [auto|manual]]
既知のスレッドすべてのリストを表示するには、次のように入力します。
threads通常は表示されないスレッド (ゾンビ) などを表示するには、次のように入力します。
threads -all
threads
コマンドの詳細については、Sun WorkShop オンラインヘルプの「 dbx コマンドの使い方」の「threads コマンド」を参照してください。実行の再開
プログラムの実行を再開するには、
cont
コマンドを使用します。現在、スレッドは同期ブレークポイントを使用して、すべてのスレッドが実行を再開するようにしています。LWP 情報について
通常は LWP を意識する必要はありません。ただし、スレッドレベルでの問い合わせが完全にできない場合には、
lwps
コマンドを使用して、LWP に関する情報を入手できます。
(dbx)
lwps
l@1 実行中:現在の関数 main()
l@2 実行中:現在の関数 sigwait()
l@3 実行中:現在の関数 _lwp_sema_wait()
*>l@4 ブレークポイント:現在の関数 Queue_dequeue()
l@5 実行中:現在の関数 _thread_start()
(dbx)
- * (アスタリスク) は、ユーザーの注意を要するイベントが この LWP で起こったことを示します。
- 矢印は現在の LWP を表します。
l@
num は特定の LWP を示します。- 「スレッドの状態と LWP の状態」では詳しい LWP の状態を説明しています。
- func_name() は、LWP が現在実行している関数を示します。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |