2017-07-04 9 views
3

JVMのスタックトレースはどのように機能しますか?カスタムJVM言語:実行可能なスタックトレースを作成しますか?

擬似Javaファイルではなく、親言語に関連するスタックトレースを持つようにクラスファイルを変換することはできますか?

具体的には、このミックスインライブラリhttps://github.com/SpongePowered/Mixinを修正して、メソッドにコードを上書き/挿入するときに、エラーが発生した場合、ソースの正しいmixin擬似クラスを指すようにすることができますか?

答えて

2

Javaソースコードファイルをまったく用意する必要はありません。

関連する属性は2つだけです。

  1. .javaファイルである必要はありませんソースコードファイルの名前を指定SourceFileクラス属性。

  2. Code属性に適用される属性で、バイトコード命令がソースコード行にどのようにマップされるかを示します。

スタックトレースは、上記の2つの属性によって報告されたソースファイル名と行番号と共に、クラスとメソッド名を報告します。その背後には意味がありません。

これらの属性は、デバッガが指定されたファイル(テキストベースであることを前提としています)をロードし、特定の行をハイライトするだけでよいので、ステップデバッグを行うには十分です。私はすでにXSLTプロセッサを使ってバイトコードに動的にコンパイルされたこの方法でXSLTファイルを踏んでいます。ローカル変数を検査可能にする場合は、LocalVariableTable属性もコードに追加する必要があります。

また、コード生成をトリガーした元のコードを指すメタ情報を持つコードを生成する方法もありました。ラムダ式用に生成された合成メソッドは、それを定義するソースコードレベルメソッド内のラムダ式を指す行番号テーブルを持つため、通常のJavaソースコードがコンパイルされるときにも発生します。

+1

1つ以上のソースファイルから1つのクラスファイルを作成できますか? Mixinライブラリでは、クラスをロードする際に、トランスを介してメソッドが追加および置換されています。 –

+1

まあ、 'SourceFile'属性が1つしかないので、1つのソースファイルだけを指すことができます。あなたは通常、デバッグ情報内の別のソースファイルを指すことができる、他のクラスファイル内のコードを呼び出す非常に小さな注入コードしか持たない委譲を使用してこれを解決します。 – Holger

+0

スタックトレースがhttps://jcp.org/en/jsr/detail?id=45を尊重しないのはやや厄介です。 –

関連する問題