• 検索結果がありません。

使用方法

ドキュメント内 トラブルシューティング集 (ページ 170-177)

第9章 J2EEアプリケーション開発・運用時の異常

A.1 メソッドトレース機能

A.1.5 使用方法

メソッドトレース機能とは、Javaアプリケーションのメソッドの呼出しをトレースする機能です。

メソッドトレース機能が出力するトレース情報により、次のことがわかります。

・ アプリケーションの処理の流れ

・ Java Servlet APIのメソッドに渡される引数、およびメソッドから返される戻り値の情報

・ EJBアプリケーションのメソッドに渡される引数、およびメソッドから返される戻り値の情報

たとえば、次のような現象が発生する場合、処理がどこまで実行されているか、どの処理で停止や異常が起こっているかを 診断するうえでの有用な情報を得ることができます。

・ アプリケーションの応答がなくなった場合

・ 出力や処理結果の異常

・ Exceptionの発生

メソッドトレース機能からの情報をヒントに、アプリケーションのログや各ログ取得機能、デバッガ、APIドキュメントを参照して 原因を特定する必要があります。

動作環境

メソッドトレース機能の動作には、製品添付のJDK/JREが必要です。

A.1.1 動作原理

メソッドトレース機能は、製品添付のJDK/JREおよびJava VMから呼び出されるメソッドトレースクラスライブラリで実現され ます。

メソッドトレース機能は、以下のような流れで実現します。

1. Java VMにメソッドトレース機能を有効にする起動オプションを指定して、アプリケーションを起動します。

メソッドトレース機能を有効にする起動オプションの詳細は、“A.1.5 使用方法”を参照してください。

2. アプリケーションのクラスファイル(バイトコード)が、クラスローダ経由でJava VMに読み込まれます。

3. Java VMからメソッドトレースクラスライブラリのバイトコード変換メソッドが呼び出されます。

なお、バイトコード変換メソッドの呼び出しは、Java VM標準のJVMTI機能によって実現しています。

4. バイトコード変換メソッドによって、アプリケーションのバイトコードに、メソッドトレースクラスライブラリのトレース情報出力 メソッドを呼び出すコードが埋め込まれます。

5. 変換されたバイトコードがJava VMに渡され、アプリケーションが開始されます。

6. 開始されたアプリケーションのバイトコード内に、トレース情報出力メソッドの呼出しコードがあると、メソッドトレースク ラスライブラリによって、トレース情報が出力されます。

A.1.2 使用手順

次の手順を行うことにより、メソッドトレース機能を使用することができます。

1. メソッドトレース機能の動作を設定するための“制御ファイル”を作成します。

制御ファイルの作成方法は、“A.1.4 制御ファイルの作成方法”を参照してください。

2. 環境変数PATHまたはCLASSPATHにメソッドトレース機能の動作に必要なパスを追加します。

メソッドトレースの格納先は“A.1.3 格納先”、環境変数の設定方法は“A.1.5 使用方法”を参照してください。

3. Java VMにメソッドトレース機能を有効にする起動オプションを指定して、アプリケーションを起動します。

起動オプションの指定方法は、“A.1.5 使用方法”を参照してください。

A.1.3 格納先

メソッドトレース機能の格納先

メソッドトレース機能は次の場所にインストールされます。

以下、製品を“C:\Interstage”にインストールした場合を想定しています。

・ C:\Interstage\jdk7\tools\fjtrace (JDK 7)

・ C:\Interstage\jre7\tools\fjtrace (JRE 7)

・ C:\Interstage\jdk8\tools\fjtrace (JDK 8)

・ C:\Interstage\jre8\tools\fjtrace (JRE 8)

・ /opt/FJSVawjbk/jdk7/tools/fjtrace (JDK 7)

・ /opt/FJSVawjbk/jre7/tools/fjtrace (JRE 7)

・ /opt/FJSVawjbk/jdk8/tools/fjtrace (JDK 8)

・ /opt/FJSVawjbk/jre8/tools/fjtrace (JRE 8) メソッドトレース機能の動作に必要なモジュール

メソッドトレース機能のインストール先には、次のモジュールが格納されています。

・ mt.jar

・ bcel-5.1.jar (JDK7だけ)

・ jakarta-regexp-1.2.jar

・ fjtrace.dll

・ TraceAgent.dll

・ mt.jar

・ bcel-5.1.jar (JDK7だけ)

・ jakarta-regexp-1.2.jar

・ libfjtrace.so

・ libtraceagent.so

A.1.4 制御ファイルの作成方法

制御ファイルの作成方法を説明します。

制御ファイルは、メソッドトレース機能の動作を定義するためのファイルです。

制御ファイル名は、メソッドトレース機能を使用するJava VMの起動時に指定します。

トレース対象のメソッド名、トレース情報の出力形式、トレース情報の出力先、ファイルローテーションの動作などを定義で きます。

記述形式

制御ファイルは、以下の形式で記述します。

定義名=定義値

・ 1行1項目で指定します。

・ コメントを記述する場合は、“#”以降に記述します。

・ 定義名を重複して指定した場合は、最後に正しく指定した項目が有効になります。

ただし、重複指定可能な“traceMethod”および“not_traceMethod”を除きます。

・ 1行の記述が“定義名=定義値”の形式になっていない場合、または、以下の“制御ファイルの定義項目”に記載され

ていない定義名を指定した場合、その行は無効となります。

・ 定義値の指定に誤りがある場合の解釈は、定義項目によって異なります。詳細は、それぞれの定義項目を参照して ください。

・ 定義名および定義値に使用する文字列は、大文字と小文字は区別され、異なる文字として扱われます。

なお、メソッドトレース機能の格納先に、制御ファイルのサンプル(fjtrace.conf)がありますので、参考にしてください。

定義項目の一覧

制御ファイルに定義できる項目を、次の表に示します。

定義名 説明

statementStyle トレース対象のメソッドの指定に正規表現を用いるかを指定します。

制御ファイルの記述の誤りについて通知するメッセージの出力にも影響を与えます。

traceMethod トレース対象のメソッドを指定します。

not_traceMethod 非トレース対象のメソッドを指定します。

classPath 動的に決定されるクラスパスを指定します。

valueLevel メソッドの引数および戻り値情報の出力形式を指定します。

timeStamp タイムスタンプ出力の有無を指定します。

traceFile トレース情報を出力するファイル名を指定します。

traceDirectory トレース情報出力ファイルを格納するディレクトリを指定します。

traceFileCount トレース情報出力ファイルのローテーション数を指定します。

traceFileSize トレース情報出力ファイルの最大サイズを指定します。

statementStyle

トレース対象のメソッドの指定に正規表現を使用するかを指定します。

statementStyle=REGEX | BASIC 以下のどちらかの定義値を指定します。

- REGEX: 正規表現を使用する

- BASIC: 正規表現を使用しない(省略値)

“REGEX”、“BASIC”以外の定義値を指定した場合、その行は無効となります。また、“statementStyle”の記述がない場

合、“BASIC”が指定されたものと解釈します。

注意

本指定に誤りがある場合は、制御ファイルの記述に誤りがあったことを通知するメッセージを標準出力(または、使用 方法記載のログファイル)に出力します。

(“statementStyle”の記述が無い場合は、メッセージの出力は行われません。)

traceMethod、not_traceMethod

トレース対象または、非トレース対象のメソッドを指定します。

traceMethod=クラス名 メソッド名 [シグネチャ]

not_traceMethod=クラス名メソッド名 [シグネチャ]

※[ ]は省略可能。

- “traceMethod”、“not_traceMethod”ともに複数指定できます。

“traceMethod”が1つも指定されていない場合は、トレースを行わずにアプリケーションを実行します。

“not_traceMethod”、“statementStyle=REGEX”が指定されている場合にのみ有効です。

(“statementStyle=BASIC”の場合、無効となります。)

- クラス名、メソッド名、シグネチャはそれぞれ半角空白で区切ります。

“traceMethod”、“not_traceMethod”とも、“statementStyle”の指定に影響を受けます。

statementStyle=REGEX指定の場合

- クラス名:クラス名を指定します。

パッケージ階層の区切りは'/'です。

例) javax/servlet/http/HttpServletRequest

クラス名には、インターフェース名やスーパークラス名を指定することもできます。

インターフェース名を指定した場合、トレース対象のプログラム内で指定のインターフェースを実装しているクラス(イ ンターフェースメソッド)をトレースします。

スーパークラス名を指定した場合、トレース対象のプログラム内で指定のクラスをスーパークラスに持つクラス(オー バライドしたメソッド)をトレースします。

正規表現を用いることで、“すべてのクラス”の指定ができます。

- .*

すべてを意味します(“.”は任意の1文字、“*”は繰り返しを示します)。

- [a-z]

範囲を示す表記です。

この場合、aからz(小文字のアルファベット)を意味します。

“[a-z]*”とすることで、小文字のアルファベットを含む文字列を意味します。

- ^クラス名$

完全一致を意味します(^は前方一致、$は後方一致を示します)。

正規表現の詳細は、apacheの提供する、jakarta-regexp V1.2のorg.apache.regexp.REのAPI仕様を参照してください。

正規表現の構文が誤っていた場合、その行を無効とし、Warningメッセージ(FJTRACE:400)を標準出力(または、

使用方法記載のログファイル)に出力します。

注意

正規表現 "[:graph:]"、"[:alpha:]"、"[:alnum:]"、"\w"には、既存のバグが存在するため正しく動作しません。

これらの正規表現の代わりに、それぞれ、"[:print:]"、"[a-zA-Z]"、"[a-zA-Z0-9]"、"[a-zA-Z0-9_]"を使用してください。

注意

.*を用いた場合、実行性能が極度に劣化します。パッケージ名を指定するなど、部分的な総称となるように指定し てください。

- メソッド名:メソッド名を指定します。

クラス名の指定に応じて、次の意味になります。

- クラス名:実装したメソッド名

- インターフェース名:インターフェースメソッド名

- スーパークラス名:サブクラスがオーバライドしたメソッド名 正規表現の指定ができます。

- .*

すべてを意味します("."は任意の1文字、"*"は繰り返しを示します)。

- [a-z]*

アルファベットの小文字を含む文字列を意味します。

- ^メソッド名$

完全一致を意味します(^は前方一致、$は後方一致を示します)。

正規表現の詳細は、apacheの提供する、jakarta-regexp V1.2のorg.apache.regexp.REのAPI仕様を参照してください。

正規表現の構文が誤っていた場合、その行を無効とし、Warningメッセージ(FJTRACE:400)を標準出力(または、

使用方法記載のログファイル)に出力します。

注意

正規表現 "[:graph:]"、"[:alpha:]"、"[:alnum:]"、"\w"には、既存のバグが存在するため正しく動作しません。

これらの正規表現の代わりに、それぞれ、"[:print:]"、"[a-zA-Z]"、"[a-zA-Z0-9]"、"[a-zA-Z0-9_]"を使用してください。

- シグネチャ:シグネチャを指定します。省略可能です。

指定するとクラス名、メソッド名で限定されたメソッドのうち、さらにシグネチャの一致する特定のメソッドを対象とします。

たとえば、クラス内にメソッド名に一致するメソッドが複数存在する(オーバーロードメソッド)場合に、特定のメソッド にトレースを限定できます。

シグネチャは、引数を示すデータ型を"()"で囲み、戻り値を示すデータ型をその後に続けて指定します。データ型の 表記方法は、“データ型の表記方法”を参考にしてください。

引数を持たず、戻り値がvoid型のメソッドの場合

引数がないため"()"内は記述しません。戻り値void型は")"の後ろに"V"を記述して示します。

"()V"

String型の配列とboolean型の2つ引数を持ち、戻り値がint型のメソッドの場合

"([Ljava/lang/String;Z)I"

ドキュメント内 トラブルシューティング集 (ページ 170-177)