自定义JVM语言:如何创建可行的堆栈跟踪?

3

JVM上的堆栈跟踪是如何工作的?

是否可以将class文件转换为具有与父语言相关联的堆栈跟踪,而不是伪Java文件?

具体来说,是否可以修改此Mixin库(https://github.com/SpongePowered/Mixin),使其在覆盖/注入代码到方法时,如果发生错误,它将指向源中正确的mixin伪类?

1个回答

2

完全不需要Java源代码文件。

只有两个相关的属性。

  1. SourceFile类属性指定源代码文件的名称,它不必是一个.java文件。

  2. LineNumberTable属性应用于Code属性,告诉字节码指令如何映射到源代码行。

堆栈跟踪只报告类和方法名称以及由上述两个命名属性报告的源文件名称和行号。没有其他语义在其中。

这些属性已经足够进行逐步调试,因为调试器只需要加载指定的文件(假设它是基于文本的)并突出显示特定行。我已经以这种方式逐步执行了一个XSLT文件,该文件已由XSLT处理器动态编译为字节码。如果您想使本地变量可检查,请还要在代码中添加{{link1:LocalVariableTable}}属性。
我也按照您的意图使用它们,生成代码的元信息指向触发代码生成的原始代码。即使是普通的Java源代码被编译时也会发生这种情况,因为为lambda表达式生成的合成方法具有指向源代码级定义它的方法内的lambda表达式的行号表。

1
一个类文件由多个源文件组成是否重要?在Mixin库中,通过转换器在类加载时向类添加和替换方法。 - Ryan Leach
1
好的,只有一个 SourceFile 属性,因此您只能指向一个源文件。通常通过使用委托来解决此问题,只注入非常小的代码,该代码将调用其他类文件中的代码,这些类文件中的代码也可以在调试信息中指向不同的源文件。 - Holger
有点烦人的是堆栈跟踪不尊重https://jcp.org/en/jsr/detail?id=45。 - Ryan Leach
说实话,我不知道 Oracle 的 JVM 在生成堆栈跟踪时是否解释 SourceDebugExtension 属性。JVM 规范没有提及其内容,因此在支持任意 JVM 时显然不能依赖它。而且我从未遇到过具有多个源和 SourceDebugExtension 属性的类文件。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接