Next: , Previous: Process Information, Up: Running


4.10 マルチスレッド・プログラムのデバッグ

HP-UXやSolarisのようなオペレーティング・システムにおいては、 1つのプログラムが複数のスレッドを実行することができます。 「スレッド」の正確な意味は、 オペレーティング・システムによって異なります。 しかし、 一般的には、 1つのアドレス空間を共有するという点を除けば、 プログラム内のマルチスレッドは、 マルチプロセスと類似しています (アドレス空間の共有とは、 複数のスレッドが同一の変数の値を参照したり変更したりすることが可能であるということです)。 その一方で、 個々のスレッドは自分用のレジスタ、 実行スタック、 そしておそらくはプライベート・メモリを持ちます。

GDBは、 マルチスレッド・プログラムのデバッグ用に、 以下のような便利な機能を提供しています。

注意: これらの機能は、 スレッドをサポートするオペレーティング・システム用に構成された すべてのGDBで使用可能なわけではありません。 GDBがスレッドをサポートしていない環境では、 これらのコマンドは無効です。 例えば、 スレッドをサポートしていないシステム上で GDBの‘info threads’コマンドを実行しても何も表示されませんし、 threadコマンドの実行は常に拒絶されます。
          (gdb) info threads
          (gdb) thread 1
          Thread ID 1 not known.  Use the "info threads" command to
          see the IDs of currently known threads.

GDBのスレッド・デバッグ機能により、 ユーザ・プログラムの実行中に、 すべてのスレッドを観察することができます。 ただし、 GDBに制御権のある状態では、 特定の1つのスレッドだけがデバッグの対象となります。 このスレッドは、 カレント・スレッドと呼ばれます。 デバッグ用のコマンドは、 カレント・スレッドの立場から見たプログラムの情報を表示します。

ユーザ・プログラム内部において新しいスレッドの存在を検出すると、 GDBは、 ‘[New systag]’という形式で、 ターゲット・システム上におけるこのスレッドのIDを表示します。 ここでsystagとはスレッドのIDで、 その形式はシステムによって異なります。 例えば、 LynxOS上では、 GDBが新しいスレッドを検出すると、

     [New process 35 thread 27]

のように表示されます。 一方、 SGIのシステム上では、 systagは単に‘process 368’のような形式で、 これ以外の情報は含まれません。

GDBは、 ユーザ・プログラム内の個々のスレッドに対して、 デバッグ用の整数値のスレッド番号を独自に割り当てます。

info threads
その時点においてユーザ・プログラム中に存在するすべてのスレッドに関する要約を表示します。 個々のスレッドに関して、 以下の情報が (列挙された順に) 表示されます。
  1. GDBにより割り当てられたスレッド番号
  2. ターゲット・システムのスレッドID(systag
  3. スレッドのカレントなスタック・フレームの要約

GDBにより割り当てられたスレッド番号の左のアスタリスク‘*’は、 そのスレッドがカレント・スレッドであることを意味しています。

以下に例を示します。

     (gdb) info threads
       3 process 35 thread 27  0x34e5 in sigpause ()
       2 process 35 thread 23  0x34e5 in sigpause ()
     * 1 process 35 thread 13  main (argc=1, argv=0x7ffffff8)
         at threadtest.c:68
thread threadno
スレッド番号threadnoを割り当てられたスレッドをカレント・スレッドとします。 このコマンドの引数threadnoは、 ‘info threads’コマンドの出力の最初のフィールドに表示される、 GDB内部のスレッド番号です。 GDBは、 指定されたスレッドのシステム上のIDとカレントなスタック・フレームの要約を表示します。
          
          (gdb) thread 2
          [Switching to process 35 thread 23]
          0x34e5 in sigpause ()

[New ...]’メッセージと同様、 ‘Switching to’の後ろに表示される情報の形式は、 そのシステムにおけるスレッドの識別方法に依存します。


thread apply [threadno] [all] args
thread applyコマンドにより、 1つのコマンドを1つ以上のスレッドに対して実行することができます。 実行対象となるスレッドのスレッド番号を、 引数threadnoに指定します。 threadnoは、 ‘info threads’コマンドの出力の最初のフィールドに表示される、 GDB内部のスレッド番号です。 すべてのスレッドに対してコマンドを実行するには、 thread apply all argsコマンドを使用してください。

GDBがユーザ・プログラムを停止させるとき、 その理由がブレイクポイントであれシグナルの受信であれ、 ブレイクポイントに到達したスレッド、 または、 シグナルを受信したスレッドが自動的に選択されます。 GDBは、 ‘[Switching to systag]’という形式のメッセージでそのスレッドを示し、 コンテキスト切り替えの発生に注意を促します。

複数スレッドを持つプログラムの停止時や起動時のGDBの動作の詳細については、 See Stopping and starting multi-thread programs

また、 複数スレッドを持つプログラムの中におけるウォッチポイントについては、 See Setting watchpoints