JVM上的堆栈跟踪如何工作?
是否可以将类文件转换为具有与父语言相关的堆栈跟踪,而不是伪java文件?
具体来说,可以修改这个Mixin库https://github.com/SpongePowered/Mixin,这样当它覆盖/注入代码到方法时,如果发生错误,它会指向源中正确的mixin伪类吗? / p>
答案 0 :(得分:2)
根本不需要Java源代码文件。
只有两个相关属性。
SourceFile
class属性,指定源代码文件的名称,不必是.java
文件。
LineNumberTable
属性应用于Code
属性,告诉字节代码指令如何映射到源代码行。
堆栈跟踪仅报告类和方法名称以及上面命名的两个属性报告的源文件名和行号。它背后没有额外的语义。
这些属性已足以执行步骤调试,因为调试器只需要加载指定的文件(假设它是基于文本的)并突出显示特定的行。我已经通过这种方式逐步完成了一个XSLT文件,该文件已由XSLT处理器动态编译为字节代码。如果要使局部变量可检查,还必须在代码中添加LocalVariableTable
属性。
我也想用它们来生成代码,这些代码的元信息指向触发代码生成的原始代码。它甚至发生在普通Java源代码被编译时,因为为lambda表达式生成的合成方法具有指向定义它的源代码级方法中的lambda表达式的行号表。