【问题标题】:Java 7 - Inconsistent stackmap frames - Need help understanding why solution worksJava 7 - 堆栈图帧不一致 - 需要帮助了解解决方案为何有效
【发布时间】:2012-10-08 02:34:17
【问题描述】:

当我在 Eclipse 中使用 JDK7 或 JDK6 编译和运行我的项目时,一切都很好。然而,在我使用 ANT 构建它然后尝试使用系统 JDK7 运行它之后,我得到了错误:

方法 myClass.myMethod() [[Ljava/lang/Object; 中分支目标 25 处的堆栈图帧不一致;在偏移 14

我到处寻找,在 StackOverFlow 上发现了几个很好的问题:

两者基本上都建议添加 -XX:-UseSplitVerifier 作为 JVM 选项,它确实解决了这个问题。我仍然不完全明白为什么,但显然 this bug report 应该会有所帮助。可惜我还是不明白...

我确实注意到有人在使用面向方面的编程的问题之一,这让我认为我正在使用Guice(Google 的 DI 框架),这可能会导致问题,但我不知道如何。假设支持JDK7。

我也在使用 Proguard,但这也应该适用于 JDK7。

无论如何,在这一点上,我不知道为什么这种解决方法有效,除了它基本上回退到以前的 JDK(在本例中为 JDK6)版本时,当代码的某些部分试图使用字节码(即为什么我认为它与 DI) 代码有关。但我仍然无法建立正确的链接。而且我也可能会离开!

如果有人能解释发生了什么或为什么会发生这种情况,我将非常感激。此外,我真的很讨厌不得不使用解决方法,因为这不是我认为的长期解决方案。

【问题讨论】:

  • " 假设支持 JDK7。" - 也许它的支持是错误的。您是否搜索过 Guice 问题跟踪器/组/列表?
  • 在他们的问题跟踪器中找不到任何关于错误的信息
  • 我的猜测是,在 java7 中,他们添加了更积极的字节码验证检查,并且任何使用字节码进行依赖注入的 guice 都不适用于这些检查
  • 当你说你用ant构建时,你是从eclipse运行ant吗?它也可能是 Eclipse 编译器中的错误,如果是这样,请尝试使用纯 javac 或从 NetBeans 构建此代码。
  • 问题是它在 Eclipse 中工作,而不是在纯 jvm 中工作。我也使用 proguard 并认为这可能是问题的一部分,但这也应该支持 JDK7

标签: java dependency-injection guice proguard java-7


【解决方案1】:

从 Java 7 开始,编译后的字节码必须包含额外的 StackMapTable 属性。这些有助于 JVM 内部的验证器在类加载时检查类的构造是否正确。 Java 的早期版本更加宽松,在没有属性的情况下使用较慢的验证。

修改原始编译字节码的工具(编译后的 ProGuard,执行前的 AOP 框架,...)需要与修改后的代码一致地更新属性。如果他们不这样做,您将收到错误消息“Inconsistent stackmap frames”。

ProGuard 应该执行此预验证罚款;我不知道它有任何问题。如果在没有应用 ProGuard 的情况下仍然看到错误,则问题必须出在 DI 或 AOP。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多