Обфускация вызывает VerifyError: ожидание кадра stackmap

мы используем последнюю версию 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 и запуск встроенной банки помогает, Но я не совсем уверен, что это должно быть способом решения этой проблемы.

Так мне интересно, если кто-то была ошибка двойники? Или если кто-то может даже знать конкретный способ решить эту проблему, например, путем настройки конфигурации proguard для процесса обфускации?

3 ответов


Я предполагаю, что вы не указание-dontpreverify? Этот параметр почти наверняка приведет к этим ошибкам, так как он остановит ProGuard от обновления атрибута StackMapTable. Атрибут был необязательным в Java 6, но он необходим в Java 7.

вы все еще можете попробовать бета-версию ProGuard 4.11, но вряд ли это имеет значение здесь. Если вы пришлете мне обработанный файл класса, я займусь им.

(Я разработчик Программы ProGuard)


Если вы, ребята, еще не нашли решение, вы можете попробовать проверить, есть ли у вас . здесь Почему это связано с StackMap. Удаление этой опции исправило эту проблему для меня.


Я также столкнулся с той же проблемой при переносе моего приложения с 1.6 на 1.7. После огромной борьбы мы нашли решение для решения этой проблемы.

подход 1: либо вы можете использовать-XX:-аргумент UseSplitVerifier решит эту проблему, и вам не нужно беспокоиться об обновлении файлов библиотеки.

подход 2: я выполнил следующие шаги, чтобы преодолеть проблему. Шаг 1. Определите и сохраните список внешних библиотек, используемых приложением. Шаг 2: После вы определяете список, продолжаете удалять один за другим внешние файлы библиотеки и подключаете обновленные файлы библиотеки версий, которые помогут вам изолировать библиотеку, которая может вызвать проблему. В моем случае: j2ee.jar и openjpa-1.2.2 JAR файлы создали проблему, а затем я обновил эти библиотеки, которые решили проблемы миграции.

следовательно, это немного медленный и болезненный процесс, чтобы выяснить, какая библиотека вызывает проблему и арестовать ее.

Я надеюсь, это информация может быть полезной, потому что она основана на моем опыте реального времени.