JVMのスタックトレースはどのように機能しますか?カスタムJVM言語:実行可能なスタックトレースを作成しますか?
擬似Javaファイルではなく、親言語に関連するスタックトレースを持つようにクラスファイルを変換することはできますか?
具体的には、このミックスインライブラリhttps://github.com/SpongePowered/Mixinを修正して、メソッドにコードを上書き/挿入するときに、エラーが発生した場合、ソースの正しいmixin擬似クラスを指すようにすることができますか?
JVMのスタックトレースはどのように機能しますか?カスタムJVM言語:実行可能なスタックトレースを作成しますか?
擬似Javaファイルではなく、親言語に関連するスタックトレースを持つようにクラスファイルを変換することはできますか?
具体的には、このミックスインライブラリhttps://github.com/SpongePowered/Mixinを修正して、メソッドにコードを上書き/挿入するときに、エラーが発生した場合、ソースの正しいmixin擬似クラスを指すようにすることができますか?
Javaソースコードファイルをまったく用意する必要はありません。
関連する属性は2つだけです。
.java
ファイルである必要はありませんソースコードファイルの名前を指定SourceFile
クラス属性。
Code
属性に適用される属性で、バイトコード命令がソースコード行にどのようにマップされるかを示します。
スタックトレースは、上記の2つの属性によって報告されたソースファイル名と行番号と共に、クラスとメソッド名を報告します。その背後には意味がありません。
これらの属性は、デバッガが指定されたファイル(テキストベースであることを前提としています)をロードし、特定の行をハイライトするだけでよいので、ステップデバッグを行うには十分です。私はすでにXSLTプロセッサを使ってバイトコードに動的にコンパイルされたこの方法でXSLTファイルを踏んでいます。ローカル変数を検査可能にする場合は、LocalVariableTable
属性もコードに追加する必要があります。
また、コード生成をトリガーした元のコードを指すメタ情報を持つコードを生成する方法もありました。ラムダ式用に生成された合成メソッドは、それを定義するソースコードレベルメソッド内のラムダ式を指す行番号テーブルを持つため、通常のJavaソースコードがコンパイルされるときにも発生します。
1つ以上のソースファイルから1つのクラスファイルを作成できますか? Mixinライブラリでは、クラスをロードする際に、トランスを介してメソッドが追加および置換されています。 –
まあ、 'SourceFile'属性が1つしかないので、1つのソースファイルだけを指すことができます。あなたは通常、デバッグ情報内の別のソースファイルを指すことができる、他のクラスファイル内のコードを呼び出す非常に小さな注入コードしか持たない委譲を使用してこれを解決します。 – Holger
スタックトレースがhttps://jcp.org/en/jsr/detail?id=45を尊重しないのはやや厄介です。 –