dbx コマンドによるデバッグ ホーム目次前ページへ次ページへ索引


第 12 章

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

dbx では Solaris スレッドや POSIX スレッドを使用するマルチスレッドアプリケーションをデバッグできます。dbx には、各スレッドのスタックトレースの確認、全スレッドの再実行、特定のスレッドに対する stepnext の実行、スレッド間の移動をする機能があります。

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

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

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

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

dbx は、マルチスレッドプログラムを検出すると、libthread_db.sodlopen を試行します。これは、/usr/lib にあるスレッドデバッグ用の特別なシステムライブラリです。

dbx は同期的に動作します。つまり、スレッドか軽量プロセス (LWP) のいずれかが停止すると、ほかのスレッドおよび LWP もすべて自動的に停止します。この動作は、「世界停止」モデルと呼ばれる場合があります。


注 - マルチスレッドプログラミングと LWP については、『Solaris マルチスレッドのプログラミング』を」参照してください。

スレッド情報

dbx では、次のスレッド情報を入手できます。

(dbx) threads
    t@1 a l@1  ?()  実行中:現在の関数 main()
    t@2      ?() 0xef751450 でスリープ:現在の関数 in_swtch()
    t@3 b l@2  ?() 実行中:現在の関数 sigwait()
    t@4     consumer() 0x22bb0 でスリープ:現在の関数 _lwp_sema_wait()
  *>t@5 b l@4 consumer()  ブレークポイント:現在の関数 Queue_dequeue()
    t@6 b l@5 producer()     実行中:現在の関数 _thread_start()
(dbx)

情報の各行の内容は次のとおりです。

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

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

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

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

thread

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

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 リストの各行の内容は、次のとおりです。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引