dbx コマンドによるデバッグ

第 12 章 マルチスレッドアプリケーションのデバッグ

dbx を使用すると、各スレッドのスタックトレースを調べて、特定のスレッドまたはすべてのスレッドを再開し (cont)、特定のスレッドで step または next を実行したり、スレッド間を移動したりできます。

dbx では、Solaris スレッドまたは POSIX スレッドのいずれかを使用するマルチスレッドアプリケーションをデバッグすることができます。

dbx は、libthread.so が使用されているかどうかを検出することによって、マルチスレッドプログラムかどうかを認識します。プログラムは、-lthread または -mt を使用してコンパイルすることによって明示的に、あるいは -lpthread を使用してコンパイルすることによって暗黙的に libthread.so を使用します。

この章では、dbxthread コマンドを使用して、スレッドに関する情報を入手したり、デバッグを行う方法について説明します。

この章は次の各節から構成されています。

マルチスレッドデバッグについて

dbx は、マルチスレッドプログラムを検出すると、libthread_db.sodlopen を試行します。これは、/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()

別のスレッドのコンテキストの表示

表示コンテキストを別のスレッドに切り替えるには、thread コマンドを使用します。この構文は次のとおりです。


thread [-info] [-hide] [-unhide] [-suspend] [-resume] tid

現在のスレッドを表示するには、次のように入力します。


thread

スレッド tid に切り替えるには、次のように入力します。


thread tid

スレッドリストの表示

次のコマンドは、threads リストを表示するためのものです。構文は次のとおりです。


threads [-all] [-mode [all|filter] [auto|manual]]

既知のスレッドすべてのリストを表示するには、次のように入力します。


threads

通常は表示されないスレッド (ゾンビ) などを表示するには、次のように入力します。


threads -all

実行の再開

プログラムの実行を再開するには、cont コマンドを使用します。現在、スレッドは同期ブレークポイントを使用して、すべてのスレッドが実行を再開するようにしています。

LWP 情報について

通常は LWP を意識する必要はありません。ただし、スレッドレベルでの問い合わせが完全にできない場合には、lwps コマンドを使用して、LWP に関する情報を入手できます。


(dbx) lwps
*>l@1 ブレークポイント	現在の関数 main()
  l@2 実行中	現在の関数 __signotifywait()

コマンド参照

thread

次のコマンドのうち tid が指定されていないコマンドでは、現在のスレッドが暗黙指定されます。

指定スレッドに関する既知の情報すべてを表示するには、次のように入力します。


thread -info tid

指定の (または現在の) スレッドを隠すか、または表示します。これは、総称 threads リストに表示される場合とされない場合があります。


thread [-hide | -unhide] tid

すべてのスレッドを表示します。


thread -unhide all

指定のスレッドを実行させないようにします。中断されたスレッドは、threads リストに S をつけて示されます。


thread -suspend tid

-suspend の効果を取り消します。


thread -suspend tid

threads

現在のモードを表示します。


threads -mode

スレッドがデフォルトによりすべてのスレッドを表示するか、またはそれらをフィルタ処理するかを指定します。


threads -mode [all | filter]

スレッドと LWP の状態

表 12-1 スレッドと LWP の状態

スレッドと LWP の状態 

説明 

中断中 

スレッドが明示的に中断されています。 

実行可能 

スレッドは実行可能で、LWP を計算資源として保持しています。 

ゾンビ 

切り離されたスレッドが終了すると (thr_exit)、それは thr_join() によって結合されるまでゾンビ状態になります。THR_DETACHED は、スレッド作成時 (thr_create()) に指定されたフラグです。切り離されていないスレッドが終了すると、LWP と結合するまでゾンビ状態になります。

syncobj でスリープ

スレッドは、指定の同期化オブジェクトでブロック化されています。libthreadlibthread_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 の終了プロセスが進行中です。