JVM上的堆栈跟踪是如何工作的?
是否可以将class文件转换为具有与父语言相关联的堆栈跟踪,而不是伪Java文件?
具体来说,是否可以修改此Mixin库(https://github.com/SpongePowered/Mixin),使其在覆盖/注入代码到方法时,如果发生错误,它将指向源中正确的mixin伪类?
JVM上的堆栈跟踪是如何工作的?
是否可以将class文件转换为具有与父语言相关联的堆栈跟踪,而不是伪Java文件?
具体来说,是否可以修改此Mixin库(https://github.com/SpongePowered/Mixin),使其在覆盖/注入代码到方法时,如果发生错误,它将指向源中正确的mixin伪类?
完全不需要Java源代码文件。
只有两个相关的属性。
SourceFile
类属性指定源代码文件的名称,它不必是一个.java
文件。
LineNumberTable
属性应用于Code
属性,告诉字节码指令如何映射到源代码行。
堆栈跟踪只报告类和方法名称以及由上述两个命名属性报告的源文件名称和行号。没有其他语义在其中。
这些属性已经足够进行逐步调试,因为调试器只需要加载指定的文件(假设它是基于文本的)并突出显示特定行。我已经以这种方式逐步执行了一个XSLT文件,该文件已由XSLT处理器动态编译为字节码。如果您想使本地变量可检查,请还要在代码中添加{{link1:LocalVariableTable
}}属性。
SourceFile
属性,因此您只能指向一个源文件。通常通过使用委托来解决此问题,只注入非常小的代码,该代码将调用其他类文件中的代码,这些类文件中的代码也可以在调试信息中指向不同的源文件。 - HolgerSourceDebugExtension
属性。JVM 规范没有提及其内容,因此在支持任意 JVM 时显然不能依赖它。而且我从未遇到过具有多个源和SourceDebugExtension
属性的类文件。 - Holger