ASM中哪些指令只用于调试?

3
我希望简化我的汇编代码。 目前,我正在使用Eclipse中的字节码大纲来学习如何编写代码。由于我只看到带有调试信息的字节码,因此我不知道哪些内容可以安全地省略,我更喜欢得到一个由有经验的人快速回答而不是自己测试每种可能性。
这些假设是否正确?
  1. 我可以混合不同的样式,即使在同一个类或方法中(将没有调试信息的代码注入到具有调试信息的方法中)
  2. visitLabel 只需要作为跳转指令的目标,而不是在每个指令周围都需要
  3. visitLineNumber 可以省略(调试信息)
  4. visitLocalVariable 可以省略(调试信息)
谢谢!

你能否在不包含调试信息的情况下编译代码?否则,您可以根据需要添加或删除调试信息,因为这些信息将会被忽略。 - Peter Lawrey
我可以这样做,但通常我想要调试它,不想在编译器设置上来回切换 - 这是一种方便的事情。而我最感兴趣的是1. - 我自己无法得到答案,除非进行耗时的测试。我只是希望为所有遇到相同问题的人记录下来。 - Arne
把它文档化是个好主意。一般来说,除非有充分的理由(例如混淆代码),大多数人都会保留调试信息。 - Peter Lawrey
1个回答

2

您可以在Bytecode Outline View中查看没有调试信息的代码,例如在Eclipse中使用单独的项目。

现在回答您的问题:

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

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