マニュアルページ tha.1
名前
tha - スレッドアナライザ実験の解析用 GUI
形式
tha args
説明
tha コマンドは、collect(1) コマンドを使用してコレクタに よっ
て 収 集された各種スレッドアナライザ実験を解析するための GUI
を呼び出します。呼び出されるのは、スレッドアナライザ実験の検
査用にカスタマイズされたアナライザの GUI です。
コレクタは、プロセスの実行中にスレッドアナライザの情報を収集
して、スレッドアナライザ実験を作成します。tha コマンドはそう
した実験を読み込み、エラーを検出した場合は、そのエラーを表示
し ま す。現在のスレッドアナライザは、データ競合およびデッド
ロックの検出をサポートしています。これらの機能の詳細は、それ
ぞれ後述の "データ競合の検出" および "デッドロックの検出" セ
クションを参照してください。
コマンド行の tha コマンドは、er_print(1) ユーティリティー と
して利用できます。
tha を起動するには、コマンド行で次のように入力します。
tha[ thread-analyzer-experiment]
f3tha および analyzer(1) のどちらでも、スレッドアナライザ 実
験を読み込むことができます。tha コマンドの機能は analyzer コ
マンドと同じですが、デフォルトのタブが、スレッドアナライザ実
験に関係するタブに簡素化されています。
オプション
オプション
意味
-j|--jdkhome jvmpath
analyzer の実行に必要な Java[TM] 仮想マシン (JVM)
ソフトウェアへのパスを指定します。デフォルトでは、
JDK_HOME、JAVA_PATH 環境変数の順に JVM へのパス が
な い かチェックされて、見つかったパスが使用されま
す。どちらの環境変数も設定されていない 場 合、 Sun
Studio リリースと一緒に Java[TM] 2 Platform, Stan-
dard Edition がインストールされた場所がデフォル ト
の パ ス となり、Sun Studio リリースと一緒にインス
トールされていない場合は、ユーザーの
PATH に設定されているパスが使用されま す。 ("Java
仮想マシン" および "JVM" という用語は、Java(TM) プ
ラットフォーム用の仮想マシンを意味する。)
-J jvm-option
JVM(TM) ソフトウェアのオプションを指定します。
-f|--fontsize size
analyzer で使用するフォントサイズを指定します。
-v|--verbose
起動の前にバージョン情報と Java 実行時引数を出力し
ます。
-V|--version
バージョン情報を出力して、終了します。
-?|-h|--help
使用法情報を出力して、終了します。
THA ウィンドウ -- 左側のタブ
tha ウィンドウは、メニューバー1 つとツールバー1 つ、それに各
種表示用のタブからなる分割区画 1 つから構成されています。
左側の区画には、重要なデータを表示するためのタブがあります。
この区画に実際に存在するタブは、.er.rc ファイルの rtabs 指令
によって制御されます。「実験」タブはつねに表示されます。「競
合」 タ ブ は、読み込まれた実験の少なくとも 1 つにデータ競合
データが存在する場合に表示されます。「デッドロック」タブは、
読 み込まれた実験の少なくとも 1 つにデッドロックデータが存在
する場合に表示されます。「デュアルソース」タブは、「競合」ま
た は 「デッドロック」タブのいずれかが表示されると表示されま
す。
デフォルトでは、「競合」タブが選択されています。「競合」タブ
がない場合は、「デッドロック」タブが選択されています。このど
ちらのタブもない場合は、「実験」タブのみ表示されます。
「競合」タブ
「競合」タブは、読み込まれた実験の少なくとも 1 つにデー
タ 競合データが存在する場合に表示されます。このタブは、
プログラムで検出されたデータ競合の一覧です。デフォル ト
では、このリストの最初のデータ競合が選択されています。
データ競合ごとに、次の情報が表示されます。
(1) データ競合を特定する一意の ID
(2) データ競合に関係する 1 つ以 上 の 仮 想 ア ド レ ス
(Vaddr)。データ競合が複数の仮想アドレスで発生している場
合は、1 つのアドレスではなく、"(複数アドレス)" と表示さ
れます。
(3) データ競合を構成する 2 つの異なるスレッドによ る 2
つ のアクセス。それぞれのアクセスについてアクセスの種類
(Read または Wirte) と、ソースコード内のアクセスが発 生
した関数、オフセット、行番号が表示されます。
(4) データ競合に関係する総トレース数。個々の ト レー ス
は、 「総トレース数」ラベルの左側のボタンをクリックする
ことによって表示できます。
トレースはそれぞれ、2 つのデータ競合アクセスが発生し た
時 点のスレッド呼び出しスタックのペアを表します。トレー
スを選択すると、tha ウィンドウの右側区画の「競 合 の 詳
細」タブにその 2 つの呼び出しスタックが表示されます (次
を参照)。デフォルトでは、1 つ目のアクセスの呼び出 し ス
タック先頭のフレームが選択されています。
「デッドロック」タブ
「デッドロック」タブは、読み込まれた実験の少なくとも 1
つ にデッドロックデータが存在する場合に表示されます。こ
のタブは、プログラムで検出されたデッドロックの 一 覧 で
す。 デフォルトでは、デッドロック一覧の最初のフレームが
選択されています。
デッドロックごとに、次の情報が表示されます。
(1) デッドロックを特定する一意の ID
(2) デッドロックの種類 (潜在的デッドロックまたは実 デッ
ドロック)
(3) デッドロックに関係する総スレッド数。
各スレッドのコンテキストは、「総スレッド数」ラベルの 左
側 のボタンをクリックすることによって表示できます。1 つ
のスレッドコンテキストが、1 つ目のロック保持の動作と、2
つ目のロック取得の試み (デッドロック) の 2 つの動作を表
します。
スレッドコンテキストを選択すると、tha ウィンドウの右 側
区 画の「デッドロックの詳細」タブに、ロック保持とロック
要求が発生した 2 つの呼び出しスタックが表示されます (次
を参照)。
「デュアルソース」タブ
「デュアルソース」タブは、読み込まれた実験の少なくと も
1 つにデータ競合またはデッドロックデータが存在する場合
に表示されます。「デュアルソース」タブは、選択 さ れ た
データ競合またはデッドロックに関係する 2 つのソース位置
を示します。
この 2 つのソース位置は、データ競合の場合は、関係する 2
つ のアクセスのソース位置であり (「競合の詳細」タブで表
示)、デッドロックの場合は、1 つ目のロック保持の動作と、
2 つ目のロック取得の試み (デッドロック) の 2 つの動作 (
「デッドロックの詳細」タブで表示)です。
アクセスが発生したソース行は強調表示されます。 -g を 付
け てソースコードがコンパイルされていた場合は、コンパイ
ラのコメントがソースコード内にインターリーブされて表 示
されることがあります。
各ソース行の左側には、その行に関係するメトリックが表 示
さ れます。データ競合の場合、デフォルトで表示されるメト
リックは「排他競合アクセス」メトリックであり、このメ ト
リッ クは、その行についてデータ競合アクセスが報告された
回数を示します。デッドロックの場合、デフォルトで表示 さ
れ るメトリックは「排他デッドロック」メトリックであり、
このメトリックは、その行について、1 つのデッドロック に
関 係するロック保持またはロック要求動作が報告された回数
を示します。
排他メトリックは、それらが現れるソース行にのみ関係し ま
す。 包 含 メトリックは、それらが現れるソース行と、その
ソース行から呼び出されたすべての関数に関係します。カ ウ
ン トメトリックは整数で示されます。百分率は 0.01 の精度
まで示されます。丸めがあるため、百分率値の合計 が 100%
にならないことがあります。
表示されるメトリックは、「データ表示方法の設定」ダイ ア
ロ グで変更することができます (後述の「データ表示方法オ
プションの選択」を参照)。
ソース表示のメトリック列の順序を変更するには、列の見 出
しをドラッグして、目的の位置に移動します。
「実験」タブ
「実験」タブは、2 つのパネルに分かれています。上のパ ネ
ル は、読み込まれた実験内のロードオブジェクトのノードか
らなるツリーです。下のパネルは、tha セッションで出力 さ
れたエラーメッセージや警告メッセージが表示されます。
「実験」タブの詳細は、analyzer(1) のマニュアルページ を
参照してください。
THA ウィンドウ -- 右側のタブ
tha ウィンドウの右側の区画には、データ競合に関する追加情報を
表示するためのタブが含まれます。「概要」タブは常に表示されま
す。「競合の詳細」タブは「競合」タブが表示されると表示され、
「デッドロックの詳細」タブは「デッドロック」タブが表示される
と表示されます。
「概要」タブ
「概要」タブは、「競合」タブで選択されたデータ競合の 概
要 情 報 を表示します。この情報は、オブジェクトファイル
名、ソースファイル名、およびプログラムカウンタ (PC) ア
ドレスです。
「競合の詳細」タブ
「競合の詳細」タブは、「競合」タブが前面に表示される た
び に、また「競合」タブで選択が行われるたびに選択状態に
なります。このタブは、「競合」タブで選択されたデータ 競
合またはトレースの詳細情報を表示します。
「競合の詳細」タブは 2 つの区画に分かれています。上の区
画は、選択されたデータ競合またはトレースの 1 つ目のアク
セス (アクセス 1) の情報を表示し、下の区画は、選択さ れ
たデータ競合またはトレースの 2 つ目のアクセス (アクセス
2) の情報を表示します。
「競合」タブでデータ競合またはトレースを選択 す る と、
「競合の詳細」タブに次の情報が表示されます。
(1) データ競合またはトレースの ID
(2) データ競合に関係する仮想アドレス (Vaddr)。データ 競
合 が複数の仮想アドレスで発生している場合は、1 つのアド
レスではなく、"(複数アドレス)" と表示されます。
また、2 つのアクセスのそれぞれに次の情報も表示します。
o データ競合アクセスの種類 (read または write)
o 「競合」タブでデータ競合が選択された場合、「競合の 詳
細」 タ ブ は、そのデータ競合アクセスが発生した時点のス
レッドのリーフ PC を表示します。これに対し「競合」タ ブ
で トレースが選択された場合は、そのデータ競合アクセスが
発生した時点のスレッドの呼び出しスタックを表示しま す。
デ フォルトでは、呼び出しスタック先頭のフレームが選択さ
れています。
「デッドロックの詳細」タブ
「デッドロックの詳細」タブは、「デッドロック」タブが 前
面 に表示されるたびに、また「デッドロック」タブで選択が
行われるたびに選択状態になります。このタブは、「デッ ド
ロッ ク」タブで選択されたスレッドコンテキストの詳細情報
を表示します。
選択されたスレッドコンテキストごとに、デッドロック ID、
デッ ドロックの種類、およびスレッド ID が表示されます。
また、関係する 2 つのロック動作ごとに、ロック動作の種類
(ロック保持またはロック要求) とスレッドの呼び出しスタッ
クが表示されます。デフォルトでは、呼び出しスタック先 頭
のフレームが選択されています。
データ競合の検出
データ競合は、1 つのプロセス内の 2 つ以上のスレッド が メ モ
リー上の同じ場所に同時にアクセスし、かつそのアクセスの少なく
とも 1 つが書き込みアクセスで、かつどのスレッドも排他的 ロッ
クを使用して、そのメモリーへのアクセスを制御していない場合に
発生します。このような状況下では、アクセス順序が非決定的とな
り、アクセス順序により、実行のたびに演算結果が異なることがあ
ります。害のない良性のデータ競合もありますが (たとえ ば、 ビ
ジー 待ちのメモリーアクセスなど)、多くのデータ競合はプログラ
ムのバグです。
データ競合検出実験は、マルチスレッドプロセスの実行中に検出さ
れたデータ競合を記録します。データ競合の検出は、POSIX スレッ
ド API、Solaris スレッド API、OpenMP、Sun 並列指令、Cray 並
列指令、あるいはそれらの組み合わせを使用して記述されたマルチ
スレッドプログラムに対して機能します。
データ競合の検出に必要な手順は次の 3 つです。
手順 1: ソースコードに計測機構を組み込む
プログラムでデータ競合の検出を行えるようにするには、 専
用 のコンパイラオプションを付けてソースファイルをコンパ
イルします。C、C++、および Fortan 90 用の特殊オプション
は次のとおりです。
-xinstrument=datarace
OpenMP 指令、Sun 指令、または Cray 指令を使用して並列化
し たプログラムでデータ競合の検出を行うには、新バージョ
ンの libmtsk が必要です。このバージョン用のパッチが、製
品 リ リー ス時に発行される予定です。それより前のもので
は、そのライブラリのコピーが bits ともにインストール さ
れ、collect によって自動的に収集されます。
手順 2: データ競合検出用の実験を作成する
プログラムを実行して、プロセスの実行中にデータ競合検 出
用の実験を作成するには、collect コマンドで -r race フラ
グを使用します。
収集されるデータ競合検出データは、競合を構成するデー タ
ア ク セ スのペアで構成されます。データ競合検出データは
「競合アクセス」メトリックに変換されます。
詳細は、collect(1) を参照してください。
手順 3: データ競合検出用実験を検証する
データ競合検出用実験は、 tha か analyzer コ マ ン ド
(GUI)、 または er_print ユーティリティー(コマンド行) を
使用して検証できます。
tha と analyzer とはともに GUI インタフェースを提供しま
す。 デ フォルトタブが簡素化されていることを除けば、tha
は analyzer と同じです。これに対し er_print ユーティ リ
ティーは、コマンド行インタフェースを提供します。
デッドロックの検出
デッドロックは、2 つ以上のスレッドが互いの待ち状態になり、永
久にその実行が妨げられる (滞る) 状態を表します。デッドロック
の原因は、プログラムロジックの誤り、同期機構や境界の不適切な
使用など数多く存在します。
スレッドアナライザは、相互排他ロックの不適切な使用を原因とす
るデッドロックを検出します。この種のデッドロックは、マルチス
レッドアプリケーションでよく起きます。2 つ以上のスレッドを持
つプロセスがあると仮定します。相互排他ロックの不適切な使用を
原因とするデッドロックは、次の 3 つの条件が成立した場合に 発
生します。
(1) すでにロックを保持しているスレッドが新しいロックを 要 求
し、かつ
(2) それらの新しいロック要求の発生タイミングが同時で、かつ
(3) 2 つ以上のスレッドが、それぞれチェーン内で次のスレッドが
保持するロックを待つ循環チェーンを形成している。
次に簡単なデッドロック状態の例を示します。
スレッド 1: ロック A を保持していて、ロック B を要求
スレッド 2: ロック B を保持していて、ロック A を要求
プログラムを実行したとき、デッドロックは潜在的デッドロックに
なることもあれば、実デッドロックになることもあります。潜在的
デッドロックは、プログラムを実行したとき実際には発生しなかっ
たが、スレッドのスケジューリングやスレッドによるロック要求の
タイミングによって、プログラムのほかの実行時に発生する可能性
があるデッドロックです。これに対し実デッドロックは、プログラ
ムを実行したときに実際に発生したデッドロックです。実 デッ ド
ロックでは、関係するスレッドの実行が滞りますが、プロセス全体
の実行は滞ることもあれば、そうでないこともあります。
デッドロック検出用実験は、マルチスレッドプロセスの実行中に検
出 さ れた潜在的デッドロックと実デッドロックの両方を記録しま
す。デッドロックの検出は、POSIX スレッド API、Solaris スレッ
ド API、OpenMP、Sun 並列指令、Cray 並列指令、あるいはそれら
の組み合わせを使用して記述されたマルチスレッドプログラムに対
して機能します。
デッドロックの検出に必要な手順は次の 2 つです。
手順 1: デッドロック検出用の実験を作成する
プログラムを実行して、プロセスの実行中にデッドロック 検
出 用 の 実 験 を 作 成 するには、collect コマンドで -r
deadlock フラグを使用します。
収集されるデッドロック検出データは、循環チェーンを形 成
す るロック保持とロック要求で構成されます。デッドロック
検出データは「デッドロック」メトリックに変換されます。
詳細は、collect(1) を参照してください。
手順 2: デッドロック検出用の実験を検証する
デッドロック検出用実験は、tha か analyzer コ マ ン ド
(GUI)、 または er_print ユーティリティー(コマンド行) を
使用して検証できます。
tha と analyzer とはともに GUI インタフェースを提供しま
す。 デ フォルトタブが簡素化されていることを除けば、tha
は analyzer と同じです。これに対し er_print ユーティ リ
ティーは、コマンド行インタフェースを提供します。
データ表示方法オプションの選択
「データ表示方法の設定」ダイアログを使用してデータの表示方法
を 制 御することができます。このダイアログを開くには、ツール
バーにある「データ表示方法の設定」ボタンをクリックす る か、
「表示」メニューから「データ表示方法の設定」を選択します。
「データ表示方法の設定」ダイアログには、7 つのタブがあるタブ
付き区画があります。詳細は、analyzer(1) のマニュアルページを
参照してください。
デフォルト
スレッドアナライザは、現在のディレクトリ、ユーザーの ホー ム
ディレクトリの順に .er.rc ファイルを検索し、そのファイルに含
まれる指令を処理します。どちらのディレクトリにも .er.rc ファ
イルが存在しない場合は、製品とともにインストールされたシステ
ムの .er.rc ファイルの指令を処理します。
これらの .er.rc ファイルには、スレッドアナライザを起動したと
きに表示するタブのデフォルト設定を含めることができます。「実
験」タブ (headers)、「タイムライン」タブ (timeline)、 「デュ
ア ル ソー ス」 タ ブ (dsrc)、 「ソー ス/逆アセンブリ」タブ
(srcdis) を除き、これらのタブには、er_print コマンドによって
対応するレポートの名前が付けられます。
.er.rc ファイルにはまた、メトリック、ソート、コンパイラ注釈
オプションの指定、ソースおよび逆アセンブリ出力のしきい値の強
調表示に関するデフォルト設定を含めることもできます。また、ほ
か の コ ンパイラに対する C++ 名復号化時のパスや「タイムライ
ン」タブおよび名前の書式のデフォ ル ト 設 定、 表 示 モー ド
(viewmode) の設定を指定することもできます。
.er.rc ファイルにはまた、元の実験を読み込んだときに、派生し
た 実験を選択して読み込むかどうかを制御する en_desc {on|off}
設定を指定することもできます。
また、ソースおよびオブジェクトファイルの検索パスを制御する指
令 を 含 め ることもできます。スレッドアナライザでは、.er.rc
ファイルは、「データ表示方法の設定」ダイアログで「保存」ボタ
ンをクリックすることによって保存できます (「データ表示方法の
設定」ダイアログは「表示」メニューから開くことがで き る )。
「データ表示方法の設定」ダイアログからの .er.rc ファイルの保
存は、スレッドアナライザの以降の呼び出しに影響するばかりでな
く、 er_print および er_src ユーティリティーにも影響します。
これらの指令とファイル、およ び そ の 処 理 に つ い て は、
er_print(1) のマニュアルページを参照してください。
スレッドアナライザは、処理したユーザーの .er.rc ファイルの名
前を付けて、タブを読み込んだときに生成された処理メッセージな
どのメッセージをそのエラー/警告ログに書き込みます。
関連項目
analyzer(1)、 collect(1)、 er_archive(1)、 er_cp(1)、
er_export(1)、 er_mv(1)、 er_print(1)、 er_rm(1)、
er_src(1)、 tha(1)、および 『プログラムのパフォーマ ン ス 解
析』