java调试使用JDB(或类似工具)生成的字节码
因此,我有一些出错的代码要调试,其中有东西抛出了一个NPE,我想逐步通过一些生成的方法来尝试找出原因
除了盲目地走没有什么用处
Thread-4[1] list
Source file not found: Foo.java
Thread-4[1] locals
Local variable information not available. Compile with -g to generate variable information
代码是生成的,因此当然没有可用于JDB的.java
文件
因为我没有用javac编译它,所以也没有指定任何-g
标志
我能告诉JDB给我看字节码吗(他显然有,否则java就没有什么可执行的)
我是否可以告诉ASM生成局部信息,就像它是用^{
或者是否有一个有用的调试器可以完成我正在寻找的任务
# 1 楼答案
生成局部变量信息相当容易。在目标方法访问者上发出正确的^{} 调用,声明局部变量的名称、类型和范围。这将在类文件中生成^{} attribute
当涉及到源代码级调试时,这些工具只需查找类上的^{} attribute 即可获得要加载和显示的文本文件的名称。您可以通过在目标类访问者(} 来生成它。指定的文本文件和字节码指令之间的关系可以通过调用目标方法visitor上的^{} 来声明。对于普通源代码,只需在相关行发生更改时调用它。但是对于字节码表示,它会因每个指令而改变,这可能会导致一个相当大的类文件,因此您应该明确地使这些调试信息的生成成为可选的
ClassWriter
)上调用^{现在,您只需要生成文本文件。在将目标} 中,以便在生成代码时生成人类可读的形式。但我们必须扩展ASM提供的
ClassWriter
传递给代码生成器之前,可以将其包装在^{Textifier
,因为我们需要跟踪缓冲文本的行号,还希望抑制行号信息本身的输出,这将使源代码变得混乱,每个指令增加两行然后,您可以像这样一起生成类文件和源文件:
它生成的“源”文件如下所示
和
javap
报告示例生成器将两个文件放在同一个目录中,该目录已经足够
jdb
使用它了。当您将文件放入类路径resp时,它还应该与IDE调试器一起工作。项目的源路径如上所述,当您将这两个文件放入项目的类和源路径时,这也适用于IDE。我刚刚用Eclipse验证了这一点: