模糊处理导致VerifyError:期望堆栈图框架

时间:2013-11-12 12:15:14

标签: obfuscation java-7 proguard verification

我们正在使用最新的JDK 7(u45)和ProGuard版本4.10

在混淆之后,最近开始我们的发布失败,出现以下错误:

Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at
branch target 155
Exception Details:
  Location:
    com/bla/bla/service/ioc/SpringBootstrap.c()V @0: getstatic
  Reason:
    Expected stackmap frame at this location.
  Bytecode:
    0000000: b200 73b6 008b 9900 82b2 0073 b800 933b
    0000010: 1a99 0074 b200 73b6 008d 9900 6bb2 0074
    0000020: 1221 b600 cfb8 0092 4c2b b600 9c12 1db9
    ...
  Exception Handler Table:
    bci [0, 152] => handler: 155

        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getMethod0(Unknown Source)
        at java.lang.Class.getMethod(Unknown Source)
        at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

我在StackOverflow上找到了关于这个主题的几个讨论,比如

据我所知,java 7使用更严格的验证,并为类引入了堆栈映射以验证代码。所以在我的混淆过程中,这个地图似乎被破坏了,因为当我用proguard混淆我的项目时,只发生了这个异常。

使用 -XX:-UseSplitVerifier 禁用验证并启动已构建的jar有帮助,但我不确定这是否应该是处理此问题的方法。

所以我想知道是否有其他人有类似的错误?或者,如果有人甚至可能知道解决此问题的具体方法,例如通过调整混淆过程的proguard配置?

3 个答案:

答案 0 :(得分:22)

我假设你指定-dontpreverify?该选项几乎肯定会导致这些错误,因为它会阻止ProGuard更新StackMapTable属性。该属性在Java 6中是可选的,但在Java 7中是必需的。

你仍然可以试用ProGuard 4.11的测试版,但它不太可能在这里有所作为。如果您将已处理的类文件邮寄给我,我会调查它。

(我是ProGuard的开发者)

答案 1 :(得分:0)

如果您还没有找到解决方案,可以尝试检查是否有-microedition选项。 Here's为什么它与StackMap有关。删除此选项可以解决此问题。

答案 2 :(得分:0)

将我的应用程序从1.6迁移到1.7时,我也面临同样的挑战。经过巨大的斗争,我们找到了解决问题的方法。

方法1:您可以使用-XX:-UseSplitVerifier参数将解决此问题,您无需担心升级库文件。

方法2:我已按照以下步骤克服了这个问题。步骤1:确定并保留应用程序使用的外部库列表。步骤2:确定列表后,继续逐个删除外部库文件并插入升级版本库文件,这将帮助您隔离可能导致问题的库。在我的情况下:j2ee.jar和openjpa-1.2.2 jar文件创建了一个问题,然后我升级了这些已解决迁移问题的库。

因此,找出造成问题的图书馆并将其逮捕,这是一个缓慢而痛苦的过程。

我希望,这些信息可能有用,因为它基于我的实时经验。