Ответ 1
Я думаю, вы можете использовать CheckClassAdapter (http://asm.ow2.org/asm40/javadoc/user/org/objectweb/asm/util/CheckClassAdapter.html), предоставленный ASM. Он содержит более подробную информацию об ошибке проверки.
Я нахожу байт-код 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
-образный выводЯ думаю, вы можете использовать CheckClassAdapter (http://asm.ow2.org/asm40/javadoc/user/org/objectweb/asm/util/CheckClassAdapter.html), предоставленный ASM. Он содержит более подробную информацию об ошибке проверки.
Проект Kraktau Я написал полезен для отладки ошибок проверки. Он способен давать смещения байт-кода, где происходит ошибка, а также информацию о стеке и локальном типе для каждой инструкции. Он даже правильно обрабатывает флаги и маскирует информацию для подпрограмм. Он способен поймать практически все ошибки.
Не существует определенного интерфейса для распечатки верификационной информации, но если вы все еще хотите, какую функциональность вы хотите, я могу добавить его. Тем временем попытка декомпиляции вашего класса с Krakatau выведет сообщение об ошибке с информацией о ошибке проверки и информации о типе инструкции, в которой она произошла.
Обновить: Krakatau больше не выполняет проверку из-за проблем с производительностью. Если вы хотите сделать вердикцию, вам необходимо выполнить чек 3724c05ba11ff6913c01ecdfe4fde6a0f246e5db.