Хорошие инструменты для отладки VerifyError?

Я нахожу байт-код VerifyErrors, который, как известно, трудно отлаживать. JVM дает очень мало обратной связи, как правило, только текущий класс, а иногда и метод.

Некоторые примеры ошибок, с которыми я обычно сталкиваюсь при ручном проектировании байт-кода через ASM или Jasmin:

  • Stack size too large
  • Unable to pop operand off an empty stack
  • Falling off the end of the code
  • Expecting to find object/array on stack
  • Incompatible object argument for function call
  • Inconsistent stack height 4 != 2

(Чтобы быть ясным, я знаю, что все это означает, меня интересуют инструменты или методы для отладки их причин.)

Мой вопрос: Есть ли какой-нибудь инструмент, который дает подробную информацию об этих типах ошибок? Я бы, например, ценю такую ​​информацию, как

  • javap -образный вывод
  • ссылки на номера строк (или смещения байта опкода)
  • информация стека операндов (типы/глубина) в каждой строке
  • более подробные сообщения об ошибках

Ответ 2

Проект Kraktau Я написал полезен для отладки ошибок проверки. Он способен давать смещения байт-кода, где происходит ошибка, а также информацию о стеке и локальном типе для каждой инструкции. Он даже правильно обрабатывает флаги и маскирует информацию для подпрограмм. Он способен поймать практически все ошибки.

Не существует определенного интерфейса для распечатки верификационной информации, но если вы все еще хотите, какую функциональность вы хотите, я могу добавить его. Тем временем попытка декомпиляции вашего класса с Krakatau выведет сообщение об ошибке с информацией о ошибке проверки и информации о типе инструкции, в которой она произошла.

Обновить: Krakatau больше не выполняет проверку из-за проблем с производительностью. Если вы хотите сделать вердикцию, вам необходимо выполнить чек 3724c05ba11ff6913c01ecdfe4fde6a0f246e5db.