Interstage Application Server/Interstage Web Server トラブルシューティング集 |
目次
索引
![]() ![]() |
付録A Javaツール機能 | > A.1 メソッドトレース機能 |
ここでは、制御ファイルの作成方法を説明します。
制御ファイルは、メソッドトレース機能の動作を定義するためのファイルです。
制御ファイル名は、メソッドトレース機能を使用するJava VMの起動時に指定します。
トレース対象のメソッド名、トレース情報の出力形式、トレース情報の出力先、ファイルローテーションの動作などを定義できます。
制御ファイルは、以下の形式で記述します。
定義名=定義値
なお、メソッドトレース機能の格納先に、制御ファイルのサンプル(fjtrace.conf)がありますので、参考にしてください。
制御ファイルに定義できる項目を、次の表に示します。
定義名
説明
トレース対象のメソッドの指定に正規表現を用いるかを指定します。
制御ファイルの記述の誤りについて通知するメッセージの出力にも影響を与えます。トレース対象のメソッドを指定します。
非トレース対象のメソッドを指定します。
動的に決定されるクラスパスを指定します。
メソッドの引数および戻り値情報の出力形式を指定します。
タイムスタンプ出力の有無を指定します。
トレース情報を出力するファイル名を指定します。
トレース情報出力ファイルを格納するディレクトリを指定します。
トレース情報出力ファイルのローテーション数を指定します。
トレース情報出力ファイルの最大サイズを指定します。
制御ファイルに定義する項目の詳細を説明します。
statementStyle=REGEX | BASIC
トレース対象のメソッドの指定に正規表現を使用するかを指定します。
以下のいずれかの定義値を指定します。
REGEX: 正規表現を使用する
BASIC: 正規表現を使用しない(省略値)
“REGEX”、“BASIC”以外の定義値を指定した場合、その行は無効となります。また、“statementStyle”の記述がない場合、“BASIC”が指定されたものと解釈します。
本指定に誤りがある場合は、制御ファイルの記述に誤りがあったことを通知するメッセージを標準出力(IJServerでは起動情報)に出力します。
(“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]*”とすることで、小文字のアルファベットを含む文字列を意味します。- ^クラス名$
完全一致を意味します(^は前方一致、$は後方一致を示します)正規表現の詳細は、「JDKドキュメント」のjava.util.regex.PatternのAPI仕様を参照してください。
正規表現の構文が誤っていた場合、その行を無効とし、Warningメッセージ(FJTRACE:400)を標準出力(IJServerでは起動情報)に出力します。
注).*を用いた場合、実行性能が極度に劣化します。パッケージ名を指定するなど、部分的な総称となるように指定してください。
※JDK/JRE 1.4を使用し、“traceMethod”に“*”を用いたクラス名の指定(総称指定)を使用する場合、javaコマンドの起動時、“-Xbootclasspath/p”の指定が必要です。指定方法は、“使用方法”を参照してください。
メソッド名
メソッド名を指定します。
クラス名の指定に応じて、次の意味になります。
クラス名:実装したメソッド名
インタフェース名:インタフェースメソッド名
スーパークラス名:サブクラスがオーバライドしたメソッド名
正規表現の指定ができます。
- .*
すべてを意味します("."は任意の1文字、"*"は繰り返しを示します)- [a-z]*
アルファベットの小文字を含む文字列を意味します- ^メソッド名$
完全一致を意味します(^は前方一致、$は後方一致を示します)正規表現の詳細は、「JDKドキュメント」のjava.util.regex.PatternのAPI仕様を参照してください。
正規表現の構文が誤っていた場合、その行を無効とし、Warningメッセージ(FJTRACE:400)を標準出力(IJServerでは起動情報)に出力します。
シグネチャ(省略可)
シグネチャを指定します。省略可能です。
指定するとクラス名、メソッド名で限定されたメソッドのうち、さらにシグネチャの一致する特定のメソッドを対象とします。たとえば、クラス内にメソッド名に一致するメソッドが複数存在する(オーバーロードメソッド)場合に、特定のメソッドにトレースを限定できます。
シグネチャは、引数を示すデータ型を"()"で囲み、戻り値を示すデータ型をその後に続けて指定します。データ型の表記方法は、“データ型の表記方法”を参考にしてください。例1) 引数を持たず、戻り値がvoid型のメソッドの場合
引数がないため"()"内は記述しません。戻り値void型は")"の後ろに"V"を記述して示します。
"()V"例2) String型の配列とboolean型の2つ引数を持ち、戻り値がint型のメソッドの場合
"([Ljava/lang/String;Z)I"
【statementStyle=BASIC指定の場合】
クラス名
クラス名を指定します。パッケージ階層の区切りは'.'です。
例) org.apache.catalina.connector.RequestFacade
注) '*'による“すべてのクラス”の指定はできません。メソッド名
メソッド名を指定します。指定には、次の2つの方法があります。
- メソッド名:クラス名に指定したクラス内で完全一致するメソッドすべてを対象とします。
- * :クラス名で指定したクラス内すべてのメソッドを対象とします。
シグネチャ(省略可)
シグネチャを指定します。省略可能です。
指定するとクラス名、メソッド名で限定されたメソッドのうち、さらにシグネチャの一致する特定のメソッドを対象とします。たとえば、クラス内にメソッド名に一致するメソッドが複数存在する(オーバーロードメソッド)場合に、特定のメソッドにトレースを限定できます。
シグネチャは、引数を示すデータ型を"()"で囲み、戻り値を示すデータ型をその後に続けて指定します。データ型の表記方法は、“データ型の表記方法”を参考にしてください。例1) 引数を持たず、戻り値がvoid型のメソッドの場合
引数がないため"()"内は記述しません。戻り値void型は")"の後ろに"V"を記述して示します。
"()V"例2) String型の配列とboolean型の2つ引数を持ち、戻り値がint型のメソッドの場合
"([Ljava/lang/String;Z)I"
データ型の表記方法
型
シグネチャの文字
boolean
Z
byte
B
char
C
short
S
int
I
long
J
float
F
double
D
void
V(戻り値の場合のみ)
クラス(注)
Lクラス名;
配列
[
注) クラスは、'L'で始まり、';'で終わります。
クラス名は、パッケージ名を含む完全なクラス名を使用します。この時の区切り文字は'/'です。
例) Stringクラスの場合
"Ljava/lang/String;"
メソッドのシグネチャを確認するには、JDKに含まれるjavapコマンドに-sオプションを指定します。
javap -s クラス名
以下のパッケージ配下のクラスは、メソッドトレースの指定はできません。指定しても、無効となります。
また、“トレース不可のクラス”に示すクラスについては、トレース情報を出力できません。
mainメソッドを含むクラスに実装されたメソッドがトレース対象となった場合、クラスをロードするタイミングでメソッドトレースの使用するオブジェクトと競合を起こし、まれにデッドロックが発生することがあります。
その場合、以下の指定を追加することで回避できることがあります。
statementStyle=REGEX指定の場合、以下のいずれかの指定を追加してください。
statementStyle=BASIC指定の場合、以下の指定を追加してください。
classPath=動的設定されるクラスパス
メソッドトレース対象のアプリケーションが動的に決定するクラスパス(環境変数CLASSPATHに記述せず、アプリケーション内で設定するクラスパス)を持つ場合に指定します。
クラスパスの設定は、メソッドトレース機能が動作するOS環境の決まりに従います(環境変数CLASSPATHと同様の記述を行います)。
“classPath”の指定がない場合、環境変数CLASSPATHに指定されたパスが使われます。
“classPath”の指定がある場合、指定したパスの後ろに環境変数CLASSPATHのパスをつなげたものが使われます。
“classPath”は、“statementStyle=REGEX”が指定されている場合にのみ有効です。
(“statementStyle=BASIC”の場合、無効となります。)
複数のクラスパス指定時の注意事項
複数のクラスパスを記述する必要がある場合、区切り文字“;”でつないで1行で制御ファイルに記載します。改行はしないでください。
classPath=C:\Interstage\lib\isjmxrt.jar;C:\Interstage\lib\isjmxcommon.jar;[…略]
valueLevel=full | addHex | none
メソッドの引数および戻り値の出力形式を指定します。
以下のいずれかの定義値を指定します。
full |
: |
引数および戻り値の情報を出力する(省略値) |
addHex |
: |
“full”の機能に加え、文字列の16進数表示を出力する |
none |
: |
引数および戻り値の情報を出力しない |
“full”、“addHex”、“none”以外の定義値を指定した場合、その行は無効となります。また、“valueLevel”の記述がない場合、“full”が指定されたものと解釈します。
引数、戻り値の出力形式の詳細は、“トレース情報出力の形式”を参照してください。
timeStamp=true | false
タイムスタンプ出力の有効/無効を指定します。
以下のいずれかの定義値を指定します。
true |
: |
タイムスタンプを出力する |
false |
: |
タイムスタンプを出力しない(省略値) |
“true”、“false”以外の定義値を指定した場合、その行を無効とします。また、“timeStamp”の記述がない場合、“false”が指定されたものと解釈します。
“timeStamp=true”を指定した場合、メソッドトレース機能は日付と時刻の表示のため、以下のクラスを使用しています。
- java.util.Calendar
- java.text.SimpleDateFormat
これらのクラスおよび関連するクラス(※注)を直接または間接的に、複数のスレッド間で同時に使用するアプリケーションでは、デッドロックを引き起こす場合があります。
その場合、本指定をfalseに変更するか、または、トレースを行わないクラスとして“not_traceMethod”で指定してください。※注:たとえば、以下のクラスです。
- java.util.GregorianCalendar
- java.util.SimpleTimeZone
- java.util.TimeZone
traceFile=トレース情報出力ファイル名
トレース情報を出力するファイルのフルパスを指定します。
パス中のディレクトリは存在している必要があります。
パス中のディレクトリが存在しない場合、この行は無効となります。
また、同名のファイルがすでに存在した場合、上書きされます。
メソッドトレース機能を一般ユーザで起動した場合には、その一般ユーザに対する書き込み権が付与されているファイルを指定します。
traceDirectory=トレース情報出力ファイルを格納するディレクトリ
トレース情報出力ファイルを格納するディレクトリのフルパスを指定します。
ディレクトリは存在している必要があります。
存在しないディレクトリを指定した場合は、この行は無効となります。
また、メソッドトレース機能を一般ユーザで起動した場合には、その一般ユーザに対する書き込み権が付与されているディレクトリを指定します。
指定のディレクトリには、次のルールでトレース情報出力ファイルを作成します。
mt<プロセスID>_n.log
mt
:
トレース情報出力ファイルであることを示す固有の文字列です。
<プロセスID>
:
Javaアプリケーションが動作しているプロセスIDです。
_n
:
ファイル番号を示します。nは、0から始まり、最大で“traceFileCount”に指定した値-1までの番号が振られます。
.log
:
ファイルの拡張子です。
traceFileCount=トレース情報出力ファイルのローテーション数
トレース情報出力ファイルのローテーション数を指定します。1〜10(個)が指定可能です。省略値は、2(個)です。
“traceFileCount”の記述がない場合、省略値と解釈します。
0以下の定義値を指定した場合は1と解釈します。11以上の定義値を指定した場合は10と解釈します。
数字以外を指定した場合は、省略値と解釈します。
traceFileSize=トレース情報出力ファイルの最大サイズ
トレース情報出力ファイルの1個あたりの最大サイズ(MB)を指定します。1〜2147483647(MB)が指定可能です。省略値は、1(MB)です。
“traceFileSize”の記述がないか、以下を指定した場合は、省略値と解釈します。
制御ファイルの記述例を、次に示します。
---------------------------------------------------------------------- # # Interstage Component FJTRACE sample configuration file. #statementStyle=REGEX valueLevel=full timeStamp=false traceDirectory=D:\tmp traceFileCount=2 traceFileSize=1 traceMethod=^com/fujitsu/interstage/XXXX$ ^methodA$ traceMethod=^com/fujitsu/interstage/XXXX$ ^methodB$ (Ljava/lang/String;)V traceMethod=^com/fujitsu/interstage/XXXX/YYYY$ .* ----------------------------------------------------------------------
上記の記述例では、以下のようになります。
トレース情報出力形式
:
メソッドの引数および戻り値の情報を出力する
タイムスタンプ出力
:
タイムスタンプを出力しない
ファイル出力先ディレクトリ
:
D:\tmp 配下
ファイルローテーション数
:
2(個)
ファイルの最大サイズ
:
1ファイルあたり1(MB)
トレース対象メソッド
:
"com.fujitsu.interstage.XXXX"クラスの
"methodA"メソッド
"methodB"メソッド(ただし、メソッドのシグネチャが"(Ljava/lang/String;)V"のメソッドのみ)
"com.fujitsu.interstage.XXXX.YYYY"クラスのすべてのメソッド
statementStyle=BASIC(指定を省略)とした場合、以下は上記例と同じ意味を示しています。
---------------------------------------------------------------------- # # Interstage Component FJTRACE sample configuration file. #valueLevel=full timeStamp=false traceDirectory=D:\tmp traceFileCount=2 traceFileSize=1 traceMethod=com.fujitsu.interstage.XXXX methodA traceMethod=com.fujitsu.interstage.XXXX methodB (Ljava/lang/String;)V traceMethod=com.fujitsu.interstage.XXXX.YYYY * ----------------------------------------------------------------------
statementStyle=REGEXとし、総称指定を使用してServletサービスのトレースを採取する場合、ClassNotFoundExceptionというエラーメッセージが発生する場合があります。
このメッセージを止めたい場合は、トレースするクラスを詳細に指定し直すか、あるいは使用中のIJServerに合わせ(○印が指定)、以下のjarファイルのパスをclassPath指定に追加してください。
※以下の説明は、Windows(R)上で、製品をC:\Interstageにインストールした場合です。
クラス名 |
V9.0以降のIJServer |
V8.0互換モードのIJServer |
C:\Interstage\lib\isjmxrt.jar |
○ |
○ |
C:\Interstage\lib\isjmxcommon.jar |
○ |
○ |
C:\Interstage\lib\log4j-1.2.8.jar |
○ |
○ |
C:\Interstage\lib\commons-logging-api.jar |
○ |
○ |
C:\Interstage\lib\commons-digester.jar |
○ |
○ |
C:\Interstage\lib\commons-collections.jar |
○ |
○ |
C:\Interstage\lib\commons-modeler.jar |
○ |
○ |
C:\Interstage\lib\commons-beanutils.jar |
○ |
○ |
C:\Interstage\lib\javax77.jar |
○ |
○ |
C:\Interstage\lib\j2ee-sv-server.jar |
○ |
○ |
C:\Interstage\lib\servlet-server.jar |
○ |
○ |
C:\Interstage\lib\servlet-common.jar |
○ |
○ |
C:\Interstage\lib\ejb-server.jar |
○ |
○ |
C:\Interstage\J2EE\lib\isj2ee.jar |
○ |
○ |
C:\Interstage\J2EE\lib\isdeploy60.jar |
○ |
○ |
C:\Interstage\J2EE\lib\ijserverconfig.jar |
○ |
|
C:\Interstage\jmx\addons\jmxremote\lib\jmxremote.jar |
○ |
○ |
C:\Interstage\F3FMjs5\common\jslib配下のjarファイル (注1) |
○ |
|
C:\Interstage\F3FMjs5\common\lib配下のjarファイル (注1) |
○ |
|
C:\Interstage\F3FMjs5\server\jslib配下のjarファイル (注1) |
○ |
|
C:\Interstage\F3FMjs5\server\lib配下のjarファイル (注1) |
○ |
|
コンテナログにIJServer31009のメッセージで出力されるjarファイル |
○ |
○ |
(注1) 必ずこの順番で記載してください。
Webアプリケーションで使用しているユーザが作成したクラスで、ClassNotFoundExceptionが発生する場合があります。
これは、Webアプリケーションから使用されるjar群、class群は、war形式に沿ってWEB-INF/libやWEB-INF/classesに配置され動的に決定される場合があるためです。
この場合、配備されるパスをclassPathに追加します。
SampleServer.warというアプリケーションの場合の例を、以下に示します。
C:\Interstage\J2EE\var\deployment\ijserver\SampleServer\apps\SampleServer.war\WEB-INF\classes
C:\Interstage\J2EE\var\deployment\ijserver\SampleServer\apps\SampleServer.war\WEB-INF\lib\app-library.jar
※上記は、Windows(R)上で、製品をC:\Interstageにインストールした場合です。
また、他にもアプリケーションで使用しているjarファイルがある場合(IJServerディレクトリのShared/libディレクトリ配下など)、これらもあわせてclassPathに追加してください。
Servletサービスのトレースを採取する場合の設定ファイル例(statementStyle=BASIC)を以下に示します。
〔V9.0以降のIJServerを使用している場合〕 ---------------------------------------------------------------------- # # Interstage Component FJTRACE sample configuration file. # # javax.servlet.ServletConfigの実装クラス traceMethod=org.apache.catalina.core.StandardWrapperFacade * # javax.servlet.ServletContextの実装クラス traceMethod=org.apache.catalina.core.ApplicationContextFacade * # javax.servlet.http.HttpServletRequestの実装クラス traceMethod=org.apache.catalina.connector.RequestFacade * # javax.servlet.http.HttpServletRequest(ディスパッチ後) traceMethod=org.apache.catalina.core.ApplicationHttpRequest * # javax.servlet.http.HttpServletResponseの実装クラス traceMethod=org.apache.catalina.connector.ResponseFacade * # javax.servlet.http.HttpServletResponse(include後) traceMethod=org.apache.catalina.core.ApplicationHttpResponse *
# javax.servlet.http.HttpSessionの実装クラス traceMethod=org.apache.catalina.session.StandardSessionFacade * # javax.servlet.RequestDispatcherの実装クラス traceMethod=org.apache.catalina.core.ApplicationDispatcher * # javax.servlet.ServletInputStreamの実装クラス traceMethod=org.apache.catalina.connector.CoyoteInputStream *
# javax.servlet.ServletOutputStreamの実装クラス traceMethod=org.apache.catalina.connector.CoyoteOutputStream * # HttpServletResponseから取り出すjava.io.PrintWriter traceMethod=org.apache.catalina.connector.CoyoteWriter * # JSP outオブジェクトの実装クラス traceMethod=org.apache.jasper.runtime.JspWriterImpl * #サーブレットの実装クラス traceMethod=<サーブレットクラス名> * # javax.servlet.jsp.HttpJspPageの実装クラス traceMethod=org.apache.jsp.<JSP file name>_jsp * valueLevel=addHex timeStamp=true ----------------------------------------------------------------------
〔V8.0互換モードのIJServerを使用している場合〕 ---------------------------------------------------------------------- # # Interstage Component FJTRACE sample configuration file. # # javax.servlet.ServletConfigの実装クラス traceMethod=org.apache.catalina.core.StandardWrapperFacade * # javax.servlet.ServletContextの実装クラス traceMethod=org.apache.catalina.core.ApplicationContextFacade * # javax.servlet.http.HttpServletRequestの実装クラス traceMethod=org.apache.coyote.tomcat4.CoyoteRequestFacade * # javax.servlet.http.HttpServletRequestの実装クラス(forward前) traceMethod=org.apache.coyote.tomcat4.CoyoteRequestFacade * # javax.servlet.http.HttpServletRequest(forward後) traceMethod=org.apache.catalina.core.ApplicationHttpRequest * # javax.servlet.http.HttpServletResponseの実装クラス traceMethod=org.apache.coyote.tomcat4.CoyoteResponseFacade * # javax.servlet.http.HttpSessionの実装クラス traceMethod=org.apache.catalina.session.StandardSessionFacade * # javax.servlet.RequestDispatcherの実装クラス traceMethod=org.apache.catalina.core.ApplicationDispatcher * # HttpServlettResponseから取り出すjava.io.Write traceMethod=org.apache.coyote.tomcat4.CoyoteWriter * # JSP outオブジェクトの実装クラス traceMethod=org.apache.jasper.runtime.JspWriterImpl * #サーブレットの実装クラス traceMethod=<サーブレットクラス名> * # javax.servlet.jsp.HttpJspPageの実装クラス traceMethod=org.apache.jsp.<JSP file name>_jsp * valueLevel=addHex timeStamp=true ----------------------------------------------------------------------
サーブレットクラスのメソッドトレースを採取する場合、サーブレットクラス名はweb.xmlファイル等から確認してください。
JSPで作成したクラスのメソッドトレースを採取する場合、次のように指定します。
traceMethod=org.apache.jsp.<JSP file name>_jsp *
パッケージ“org.apache.jsp.”にクラス名<JSP file name>_jsp(JSP file nameにJSPソースのファイル名を指定し、その後ろに“_jsp”をつけます)と指定します。
Webアプリケーションのルートディレクトリ配下のサブディレクトリにJSPが格納されている場合は、サブディレクトリ名がorg.apache.jsp.に続くパッケージ名に含まれます。
メソッド名、シグネチャに関しては、通常と同じ指定が可能です。
状況に応じて必要のないクラスはコメントアウトしてください。
上記各実装クラスやJSPで作成したクラスの名前は、使用状況やInterstageのバージョン・レベル等により変化する場合があります。
statementStyle=BASICを指定した場合、EJBアプリケーションのデバッグ時にメソッドトレース機能を使用する場合は、作成したEJBアプリケーションのEnterprise Beanクラスを指定してください。
CMP2.0 Entity Beanの場合、Enterprise Beanクラスに“_PM”を加えた文字列を指定してください。
CMP2.0 Entity BeanのEnterprise BeanクラスがflightSample.CustomerBeanの場合
flightSample.CustomerBean_PM |
制御ファイルは、アプリケーションの起動時に一度だけ読み込まれます。
制御ファイルの内容を更新し、その内容をメソッドトレースに反映させるためには、javaコマンドの再起動が必要になります。IJServerの場合では、ワークユニットの再起動が必要になります。
なお、ワークユニットの操作方法は、“Interstage管理コンソール ヘルプ”の[Interstage管理コンソール] > [Interstage Application Server] > [システム] > [ワークユニット] > [ワークユニットごとの操作] > [IJServer] > [操作]を参照してください。
目次
索引
![]() ![]() |