Cosminexus V9 アプリケーションサーバ 機能解説 保守/移行編
java.lang.Throwable.printStackTraceメソッドで出力されるスタックトレース情報の1スタックフレーム情報ごとに,そのスタックフレームに対応するメソッド内のローカル変数情報が挿入されて出力されます。
ローカル変数を出力するための機能として,-XX:+HitachiLocalsInThrowableオプションだけを指定している場合の出力例です。
Javaプログラムの例と,それに対するスタックトレース内のローカル変数情報の出力例を示します。
Javaプログラムの例1
class Example1 {
public static void main(String[] args) {
Example1 e1 = new Example1();
Object obj = new Object();
e1.method(1, 'Q', obj); // e1.methodメソッドを実行します(5行目)。
}
void method(int l1, char l2, Object l3) {
float l4 = 4.0f;
boolean l5 = true;
double l6 = Double.MAX_VALUE;
Object[] l7 = new Object[10];
try {
<例外発生!> // methodメソッドの処理内で例外が発生した場合の処理です(15行目)。
} catch (Exception e) {
e.printStackTrace(); // スタックトレース情報を出力します(17行目)。
}
}
}
|
出力例を次に示します。
この例は,Javaプログラムの例1の5行目で実行したe1.methodメソッドの処理内で例外が発生したときに,17行目のe.printStackTraceメソッドによって出力されるスタックトレース情報です。
図5-2 Javaプログラムの例1に対するローカル変数情報の出力例(-gオプションまたは-g:varsオプションを指定して作成されたclassファイルの場合)
出力内容について説明します。
次に,-XX:+HitachiLocalsSimpleFormatオプションを指定した場合の,簡易出力フォーマットでの出力例を次に示します。なお,出力内容の説明は,標準の形式と同じです。
図5-3 -XX:+HitachiLocalsSimpleFormatオプションを指定した場合の出力例
また,javacコマンド実行時に,-gオプションまたは-g:varsオプションを指定しなかった場合,ローカル変数情報がないため,出力内容が次のように制限されます。これらは,nativeメソッドを実行した場合も同様です。
ローカル変数情報がない場合の,Javaプログラムの例1に対する出力例を次に示します。ここでは,簡易出力フォーマットでの出力例を示します。
図5-4 ローカル変数情報がない場合の出力例(簡易出力フォーマット)
図5-3に比べて,次の違いがあります。
出力するローカル変数がクラスまたは配列型の場合,アドレスだけの値表現ではトラブルシューティングに必要な情報が取得できない場合があります。このとき,-XX:HitachiCallToStringオプションの指定をしておくと,クラスまたは配列型の変数の値を文字列で取得できます。オプションには,適用範囲として,minimalまたはfullが指定できます。
-XX:HitachiCallToString=minimalオプションが指定されている場合は,java.langパッケージ内のクラスのうち,String,StringBuffer,Boolean,Byte,Character,Short,Integer,Long,Float,またはDoubleが対象になります。-XX:HitachiCallToString=fullオプションが指定されている場合は,すべてのクラスが対象になります。
次に,Javaプログラムの例と,-XX:HitachiCallToStringオプションが指定されている場合の出力例を示します。なお,ここでは簡易出力フォーマットで示します。
Javaプログラムの例2
class Example2 {
public static void main(String[] args) {
Example2 e2 = new Example2();
e2.method();// e2.methodメソッドを実行します(4行目)。
}
void method() {
String l1 = "local 1";
StringBuffer l2 = new StringBuffer(l1);
l2.append(" + local 2");
Boolean l3 = new Boolean(false);
Character l4 = new Character('X');
Long l5 = new Long(Long.MIN_VALUE);
Object l6 = new Thread();
Object[] l7 = new Thread[10];
try {
<例外発生!> // methodメソッドの処理内で例外が発生した場合の処理です(18行目)。
} catch (Exception e) {
e.printStackTrace(); // スタックトレース情報を出力します(20行目)。
}
}
public String toString() {
return "I am an Example2 instance.";
}
}
|
-XX:HitachiCallToString=minimalオプションを指定した場合の出力例を次に示します。
この例は,Javaプログラムの例1の4行目で実行したe2.methodメソッドの処理内で例外が発生したときに,20行目のe.printStackTraceメソッドによって出力されるスタックトレース情報です。
図5-5 -XX:HitachiCallToString=minimalオプションを指定した場合の出力例(簡易出力フォーマット)
出力内容について説明します。
次に,-XX:HitachiCallToString=fullオプションを指定した場合の出力例を次に示します。
図5-6 -XX:HitachiCallToString=fullオプションを指定した場合の出力例(簡易出力フォーマット)
図5-5に比べて,次の違いがあります。
ただし,次の場合は,文字列は出力されないで,アドレスだけが出力されます。
出力するローカル変数がクラスまたは配列型の場合,変数の型名と実際に代入されている値の型名が異なる場合があります。例えば,クラスの継承関係やインタフェースの実装関係によっては,異なる型名の値が変数に代入されます。
この場合に,-XX:+HitachiTrueTypeInLocalsオプションの指定によって,クラスまたは配列型の変数に実際に代入されている値の型名を追記して取得できます。
取得した文字列は,値表現の末尾に半角スペース1文字分が追記され,( )で囲まれて出力されます。このとき,出力文字列長に制限はありません。
次に,-XX:+HitachiTrueTypeInLocalsオプションが指定されている場合の出力例を示します。ここでは簡易出力フォーマットで示します。実行するプログラムは,Javaプログラムの例2です。また,この例は,-XX:HitachiCallToString=minimalオプションが指定されている場合の例です。
図5-7 -XX:+HitachiTrueTypeInLocalsオプションを指定した場合の出力例(簡易出力フォーマット)
出力内容について説明します。
なお,-XX:+HitachiTrueTypeInLocalsオプションは,-XX:HitachiCallToString=fullオプションとも同時に指定できます。
All Rights Reserved. Copyright (C) 2012, 2015, Hitachi, Ltd.