dbx を使用すると、各スレッドのスタックトレースを調べて、特定のスレッドまたはすべてのスレッドを再開し (cont)、特定のスレッドで step または next を実行したり、スレッド間を移動したりできます。
dbx では、Solaris スレッドまたは POSIX スレッドのいずれかを使用するマルチスレッドアプリケーションをデバッグすることができます。
dbx は、libthread.so が使用されているかどうかを検出することによって、マルチスレッドプログラムかどうかを認識します。プログラムは、-lthread または -mt を使用してコンパイルすることによって明示的に、あるいは -lpthread を使用してコンパイルすることによって暗黙的に libthread.so を使用します。
この章では、dbx の thread コマンドを使用して、スレッドに関する情報を入手したり、デバッグを行う方法について説明します。
この章は次の各節から構成されています。
dbx は、マルチスレッドプログラムを検出すると、libthread_db.so の dlopen を試行します。これは、/usr/lib にあるスレッドデバッグ用の特別なシステムライブラリです。
dbx は同期的に動作します。つまり、スレッドか軽量プロセス (LWP) のいずれかが停止すると、ほかのスレッドおよび LWP もすべて自動的に停止します。この動作は、「世界停止」モデルと呼ばれる場合があります。
(dbx) threads *> t@1 a l@1 ?() ブレークポイント :現在の関数 main() t@2 b l@2 ?() 実行中 :現在の関数 __signotifywait() t@3 ?() スリープ(対象不明) :現在の関数 _swtch() t@5 mt_sig() 実行可能 :現在の関数 _restorefsr()
* (アスタリスク) は、ユーザーの注意を必要とするイベントがこのスレッドで起こったことを示します。
アスタリスクの代わりに「o」が示される場合は、dbx 内部イベントが発生しています。
矢印は現在のスレッドを示します。
t@num はスレッド ID であり、特定のスレッドを指します。number は、thr_create によって返された thread_t の値になります。
b l@num は指定の LWP に結合していることを示し、a l@num は LWP に結合しアクティブであることを示します。
thr_create に渡されたスレッドの開始関数。?() は開始関数が不明であることを示します。
スレッドの状態。
スレッドが現在実行している関数。
表示コンテキストを別のスレッドに切り替えるには、thread コマンドを使用します。この構文は次のとおりです。
thread [-info] [-hide] [-unhide] [-suspend] [-resume] tid
thread
thread tid
次のコマンドは、threads リストを表示するためのものです。構文は次のとおりです。
threads [-all] [-mode [all|filter] [auto|manual]]
既知のスレッドすべてのリストを表示するには、次のように入力します。
threads
通常は表示されないスレッド (ゾンビ) などを表示するには、次のように入力します。
threads -all
プログラムの実行を再開するには、cont コマンドを使用します。現在、スレッドは同期ブレークポイントを使用して、すべてのスレッドが実行を再開するようにしています。
通常は LWP を意識する必要はありません。ただし、スレッドレベルでの問い合わせが完全にできない場合には、lwps コマンドを使用して、LWP に関する情報を入手できます。
(dbx) lwps *>l@1 ブレークポイント 現在の関数 main() l@2 実行中 現在の関数 __signotifywait()
* (アスタリスク) は、ユーザーの注意を要するイベントが この LWP で起こったことを示します。
矢印は現在の LWP を表します。
l@num は特定の LWP を示します。
「スレッドと LWP の状態」では詳しい LWP の状態を説明しています。
func_name() は、LWP が現在実行している関数を示します。
次のコマンドのうち tid が指定されていないコマンドでは、現在のスレッドが暗黙指定されます。
指定スレッドに関する既知の情報すべてを表示するには、次のように入力します。
thread -info tid
指定の (または現在の) スレッドを隠すか、または表示します。これは、総称 threads リストに表示される場合とされない場合があります。
thread [-hide | -unhide] tid
thread -unhide all
指定のスレッドを実行させないようにします。中断されたスレッドは、threads リストに S をつけて示されます。
thread -suspend tid
thread -suspend tid
threads -mode
スレッドがデフォルトによりすべてのスレッドを表示するか、またはそれらをフィルタ処理するかを指定します。
threads -mode [all | filter]
スレッドと LWP の状態 |
説明 |
---|---|
中断中 |
スレッドが明示的に中断されています。 |
実行可能 |
スレッドは実行可能で、LWP を計算資源として保持しています。 |
ゾンビ |
切り離されたスレッドが終了すると (thr_exit)、それは thr_join() によって結合されるまでゾンビ状態になります。THR_DETACHED は、スレッド作成時 (thr_create()) に指定されたフラグです。切り離されていないスレッドが終了すると、LWP と結合するまでゾンビ状態になります。 |
syncobj でスリープ |
スレッドは、指定の同期化オブジェクトでブロック化されています。libthread と libthread_db が提供するサポートのレベルによって、syncobj は、16 進アドレスのように単純な場合もあれば、より多くの情報を含む場合もあります。 |
活動状態 |
スレッドは ある LWP 上で活動中ですが、dbx はその LWP にアクセスできません。 |
不明 |
dbx が状態を判別できません。 |
lwpstate |
結合または活動中のスレッドの状態は、それに対応する LWP の状態になります。 |
実行中 |
LWP が実行中でしたが、ほかの LWP と同期をとって停止しました。 |
システムコールnum |
LWP が特定のシステムコールへの入口で停止しました。 |
システムコールが num を返す |
LWP が特定のシステムコールからの出口で停止しました。 |
ジョブ制御 |
LWP がジョブ制御のために停止しました。 |
LWP 中断 |
LWP がカーネルにブロックされました。 |
ステップ動作 |
LWP がステップ動作を完了しました。 |
ブレークポイント |
LWP がブレークポイントを検出した直後。 |
フォルト num |
LWP に特定のフォルトが起こりました。 |
シグナル name |
LWP が特定のシグナルを受け取りました。 |
プロセス同期 |
この LWP が属するプロセスが実行を開始しました。 |
LWP 終了中 |
LWP の終了プロセスが進行中です。 |