2015-03-30 3 views
3

Я пытаюсь написать приборный модуль для Java-программ. Одна конкретная инструментария, которую я собираюсь добавить, - это сбор всех объектов в списке аргументов метода и обработка некоторых из них.java.lang.VerifyError ошибки с использованием Java ASM

В настоящее время, чтобы получить список аргументов объекта, я вывожу все аргументы метода из стека, а затем нажимаю их поодиночке, добавляя между ними инструментальный вызов. Хотя это в основном работает, я вижу некоторые

java.lang.VerifyError, [1] (****) Incompatible argument to function 

ошибки типа в больших программах. Выбрасывает, а затем толкает объект обратно в стек, как-то меняет его тип? Альтернативно, есть ли лучшее решение для дублирования «N» аргументов из стека без всплытия?

+0

Написаны инструкции стека jvm, то есть вы не можете нажать 2 поплавка и вызвать метод с двойным. Ошибка заключалась бы в том, чтобы забыть параметр 'this'. В любом случае кажется, что вы либо вызываете неправильную подпись метода, либо имеете неправильные аргументы стека. –

+0

Я гарантировал, что примитивные типы вызываются правильно. Я вижу эту ошибку только для объектов. Что происходит, когда у меня есть бросок, и я поп-толкаю объект? Есть ли какие-то другие угловые случаи, которые я бы пропустил? – arunxls

+0

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

ответ

1

Куда вы вставляете свои аргументы? Предположим, вы должны хранить их в локальном массиве переменных? Вполне возможно, что вы переопределите переменные, которые там уже хранятся, но к которым обращаются позже. В этом случае вы, возможно, изменили типы хранимых переменных, которые приводят к ошибке во время проверки.

Поскольку проверка является детерминированным процессом: просто сравните байт-код неисправного метода с жалобой на верификаторы и убедитесь, что типы совпадают.

+0

Извините, что забыл обновить это. Вы правы - у меня была ошибка где-то, что привело к тому, что я переписал последний элемент существующего локального массива переменных. Я нашел, что [ASM-класс verifier] (http://asm.ow2.org/doc/faq.html#Q4) очень полезен при отладке этого. Благодаря! – arunxls

Смежные вопросы