4

私は非常に混乱している状況にあります:

行情報をオンにしてコンパイルされたクラスがあります(を使用して検証javap -l)。このクラスはロードされ、ASM で計測されます。正しいクラスがロードされていることを確認しました (つまり、別の場所からの古いクラス ファイルではありません)。また、ASM フラグClassReader.SKIP_DEBUGが設定されていないことも確認しました。を呼び出すと、このクラスに関する行情報が欠落している がThread.currentThread().getStackTrace()得られます。StackTraceElementEclipse でデバッグすると、行情報がスタック トレースに表示されます。-Xintまた、コードが JIT コンパイルされたときに最適化として情報が消去されないようにするためだけに、JVM が開始されるようにしました。

そして最も紛らわしいのは、すべてのクラスが同じように読み込まれ、インストルメント化されているにもかかわらず、これはすべてではなく一部のクラスにのみ当てはまります。これが主な理由であり、これが JVM と関係があると私が考える理由です。

だから私の質問は: JVM はスタック トレースの行情報を省略しますか?もしそうなら、いつ、どのようにこれを防ぐことができますか?

編集:明確にするために:これは、サードパーティのライブラリではなく、目の前にあるソースファイルのクラスファイルです。上記から明らかなように、情報がバイトコードに含まれていることを確認するために一生懸命努力しました。

編集:StackTraceElement行番号情報があり、別の情報がない例も見つけました。同じクラスの異なるメソッドに関係しています!

4

3 に答える 3

1

スタックトレースで報告された(またはそうではなかった)行は、ASMがクラスをインストルメントしたときに生成されたのかどうか疑問に思います。これらはコンパイル後に変更されたため、行番号はクラスファイルに表示されないため、クラスローダーで使用できません(またはjavapで報告できません)。私は実行時のコード生成の経験があまりないので、それは単なる推測ですが、おそらくそれはあなたが考えることができるものです。

于 2012-09-06T20:52:36.193 に答える
1

これは、クラス ファイルのコンパイル方法に関係しています。ここを見てください:

http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javac.html

-g フラグの周りの「デバッグ情報」を探します。-g を追加すると、コードに行番号 (およびその他の多くの有用な情報) が含まれます。

これにより、デバッグ情報がサードパーティのライブラリにさかのぼって追加されることはありません。ソースの取得、またはベンダーからのデバッグ ビルドの取得について確認する必要があります。これは通常必要ないことがわかりました。

于 2012-09-06T20:37:24.393 に答える
0

すべての行番号がJVMで使用できるわけではありません。一部のサードパーティライブラリ、特に非オープンソースライブラリは行番号なしでコンパイルされる場合があり、一部のJavaクラスでさえ、暗号化またはその他の保護されたロジックを実行する保護されたソースコードを持っています。つまり、すべてに常に行番号があるわけではありません。

于 2012-09-06T20:36:07.253 に答える