第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"