Обфускация вызывает 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-lang-verifyerror-expecting-a-stackmap-frame-at-branch-target-jdk-1-7
- java-lang-verifyerror-expecting-a-stackmap-frame
- понимание-как-разрешить-непоследовательный-stackmap-frames-исключение
- java-7-непоследовательный-stackmap-кадры-нужна помощь-понимание-почему-решение-wor
из того, что я понял, что 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 файлы создали проблему, а затем я обновил эти библиотеки, которые решили проблемы миграции.
следовательно, это немного медленный и болезненный процесс, чтобы выяснить, какая библиотека вызывает проблему и арестовать ее.
Я надеюсь, это информация может быть полезной, потому что она основана на моем опыте реального времени.