7.10.3 -XX:[+|-]HitachiLocalsInThrowable
スタックトレース中のメソッドのローカル変数情報を出力します。
説明
java.lang.Throwable.fillInStackTraceメソッド実行時に、スタックトレース中のメソッドのローカル変数情報を収集します。
- 出力形式
-
locals: name: name type: type value: value ...
-
1行目に「locals:」という見出しが出力されます。
-
2行目以降は、収集できた各ローカル変数の情報が1行ずつ出力されます。
出力されるローカル変数の情報を次に示します。
-
変数名
-
型名(基本型名、クラス名または配列型名)
-
変数値を表現する文字列
なお、各ローカル変数の出力内容は、空行で区切られています。
出力項目
出力内容
name
ローカル変数名。
メソッドに渡される引数の場合は、変数名に続いて[arg***](***は引数番号)が表示されます。
type
ローカル変数の型名(基本型名、クラス名または配列型名)。
value
ローカル変数の値を表現する文字列。
-
基本型
値をそのまま文字列化したもの
-
クラスまたは配列型
変数値がnullの場合:(null)
それ以外の場合:オブジェクトの存在するアドレス
値表現の最大文字列長は64文字です。これを超える場合は64文字目までを出力したあと、「...」という文字列が出力されます。クラスまたは配列型の場合、次の追加オプションを指定することでより詳細な表現が追加できます。
-
-XX:+HitachiLocalsSimpleFormat
-
-XX:+HitachiTrueTypeInLocals
-
-XX:HitachiCallToString
-
書式
-XX:[+|-]HitachiLocalsInThrowable
指定できる値
型:String
- -XX:+HitachiLocalsInThrowable
-
スタックトレース中のメソッドのローカル変数情報を出力します。
ただし、java.lang.StackOverflowError発生時には、このオプションは無視されます。
- -XX:-HitachiLocalsInThrowable
-
スタックトレース中のメソッドのローカル変数情報を出力しません。
デフォルト値
- 定義項目の省略
-
-XX:-HitachiLocalsInThrowable
出力例
次のJavaプログラム例を使用した出力例を、次に示します。
- Javaプログラム例
-
class Example1 { public static void main(String[] args) { Example1 e1 = new Example1(); Object obj = new Object(); e1.method(1, 'Q', obj); // 5行目 } void method(int l1, char l2, Object l3) { float l4 = 4.0f; boolean l5 = true; double l6 = Double.MAX_VALUE; // double型の最大値 Object[] l7 = new Object[10]; try { <例外発生!> // 15行目 } catch (Exception e) { e.printStackTrace(); } } }
- 出力例1
-
すべてのローカル変数情報が出力される場合
at Example1.method(Example1.java:15) locals: name: this type: Example1 value: <0x922f42d0> name: l1 [arg1] type: int value: 1 name: l2 [arg2] type; char value: 'Q' name: l3 [arg3] type: java.lang.Object value: <0xaf112f08> name: l4 type: float value: 4 name: l5 type: boolean value: true name: l6 type: double value: 1.79769E+308 name: l7 type: java.lang.Object[] value: <0x922f42d8> at Example1.main(Example1.java:5) locals: ...
- 出力例2
-
ローカル変数情報が存在しない場合
-
-gオプションまたは-g:varsオプションを付加しないでclassファイルを生成した場合
-
-gオプションまたは-g:varsオプションを付加して生成したclassファイルの、nativeメソッドの場合
at Example1.method(Example1.java:15) locals: name: this type: Example1 value: <0x922f42d0> name: [arg1] type: int value: 1 name: [arg2] type; char value: 'Q' name: [arg3] type: java.lang.Object value: <0xaf112f08> at Example1.main(Example1.java:5) locals: ...
-
注意事項
-
ローカル変数情報を完全に収集するためには、javacでclassファイルを生成する際に、-gオプションまたは-g:varsオプションを付加してclassファイル内にローカル変数情報を埋め込んでおく必要があります。-gオプションまたは-g:varsオプションを付加しないで作成されたclassファイルについては、収集可能な範囲でローカル変数情報が出力されます。
-
-gオプションまたは-g:varsオプションを付加して生成されたclassファイルでも、nativeメソッドの場合はローカル変数情報が存在しません。
-
JITコンパイラーがメソッドをJITコンパイルする際、最適化の一環として、不要と判断したローカル変数を除去することがあります。
(例)int not_used = 12345などの宣言および初期化以降未使用のローカル変数
この場合、例外発生時点のローカル変数情報には、次の値が出力されます。
型名
出力情報
boolean型
false
char型
'\0'
byte型
short型
int型
long型
float型
double型
0
クラス型
配列型
(null)
-
制御構造が複雑で行数が多いメソッドのローカル変数情報を出力する場合、解析に時間が掛かるため、例外発生時の例外オブジェクト生成処理に時間が掛かることがあります。
-
java.lang.ThreadクラスのgetStackTraceメソッドを使用して取得した、カレントスレッドのスタックトレースにローカル変数情報を出力するためには、例外発生時のスタックトレースにローカル変数情報を出力する、例外発生時のローカル変数情報収集オプション(-XX:+HitachiLocalsInThrowable)が必要になります。