私は非常に混乱している状況にあります:
行情報をオンにしてコンパイルされたクラスがあります(を使用して検証javap -l
)。このクラスはロードされ、ASM で計測されます。正しいクラスがロードされていることを確認しました (つまり、別の場所からの古いクラス ファイルではありません)。また、ASM フラグClassReader.SKIP_DEBUG
が設定されていないことも確認しました。を呼び出すと、このクラスに関する行情報が欠落している がThread.currentThread().getStackTrace()
得られます。StackTraceElement
Eclipse でデバッグすると、行情報がスタック トレースに表示されます。-Xint
また、コードが JIT コンパイルされたときに最適化として情報が消去されないようにするためだけに、JVM が開始されるようにしました。
そして最も紛らわしいのは、すべてのクラスが同じように読み込まれ、インストルメント化されているにもかかわらず、これはすべてではなく一部のクラスにのみ当てはまります。これが主な理由であり、これが JVM と関係があると私が考える理由です。
だから私の質問は: JVM はスタック トレースの行情報を省略しますか?もしそうなら、いつ、どのようにこれを防ぐことができますか?
編集:明確にするために:これは、サードパーティのライブラリではなく、目の前にあるソースファイルのクラスファイルです。上記から明らかなように、情報がバイトコードに含まれていることを確認するために一生懸命努力しました。
編集:StackTraceElement
行番号情報があり、別の情報がない例も見つけました。同じクラスの異なるメソッドに関係しています!