java - ASM 中的哪些指令仅用于调试?

标签 java java-bytecode-asm

我想简化我的 asm 代码。 到目前为止,我正在使用 Eclipse 中的字节码大纲来学习如何编写我的代码。由于我只看到带有调试信息的字节码,我真的不知道我可以安全地忽略哪些内容,我更希望有知识的人快速回答我自己测试每一种可能的情况。

这些假设是否正确?

  1. 我可以混合不同的样式,即使是在同一个类或方法中(将没有调试信息的代码注入(inject)到有调试信息的方法中)
  2. visitLabel 只需要作为跳转指令的目标,而不是围绕每条指令
  3. visitLineNumber可以省略(调试信息)
  4. visitLocalVariable可以省略(调试信息)

谢谢!

最佳答案

您可以在没有调试信息的情况下编译代码,以便在字节码大纲 View 中查看它,例如为此在 Eclipse 中使用单独的项目。

现在回答你的问题:

  1. 您可以混合使用带调试和不带调试的代码。请注意,在调试此类代码时,调试器不会显示调试信息中省略的变量。
  2. visitLabel 调用用于标记字节码中的任何位置,例如跳转指令的目标,异常处理程序范围和异常处理程序入口点的边界,局部变量和行号的范围,一些新引入的类型注释(即 JSR308 )等。
  3. visitLineNumber 生成有关调试器主要使用的行号的信息,可以省略
  4. visitLocalVariable 生成有关主要由调试器使用的本地变量的信息,可以省略

关于java - ASM 中的哪些指令仅用于调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12070402/

相关文章:

Eclipse:错误(字节码大纲)源文件[在项目中]不在其项目的构建路径上

java - 以编程方式设置(Spring)bean 属性

java - 强制方法在指定的时间间隔内运行

java - ASM jar - 为什么我的 java 项目依赖于此?

java - 检测不适用于通过反射调用的方法

java - 如何使用 ObjectWeb ASM 检查字节码操作 PUTFIELD 正在重新分配属于 'this' 对象的字段?

java - ASM 字节码替换功能未完成

java - 从大量条目中实现选择框的最佳方法

java - 如何创建 Java Web Start 应用程序的线程转储

java - 如何像横版卷轴游戏那样换行?