Есть ли дизассемблер + отладчик для java (аля OllyDbg / SoftICE для ассемблера)?

Есть ли утилита, похожая на OllyDbg / SoftICE для java? Т.е. выполнить класс (из jar / с путем к классу) и, без исходного кода, показать разборку промежуточного кода с возможностью пошагового выполнения / перехода / поиска ссылок / редактирования определенного промежуточного кода в памяти / применения редактирования к файлу ...

Если нет, то можно ли вообще написать что-то подобное (при условии, что мы готовы жить без точки доступа на время отладки)?

Изменить: я не говорю о JAD, JD или Cavaj. Это прекрасные декомпиляторы, но мне не нужен декомпилятор по нескольким причинам, наиболее примечательной из которых является то, что их вывод неверен (в лучшем случае, иногда просто неправильно). Я не ищу волшебных «байтов, скомпилированных в java-код» - я хочу увидеть фактические байты, которые вот-вот будут выполнены. Кроме того, мне бы хотелось иметь возможность изменять эти байты (как в отладчике сборки) и, надеюсь, записывать измененную часть обратно в файл класса.

Edit2: я знаю, что javap существует, но он делает только один способ (и без какого-либо анализа). Пример (код взят из документации vmspec): из кода java мы используем "javac" для компиляции этого:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}

в файл java .class. Используя javap -c, я могу получить следующий результат:

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn

Это нормально для части разборки (не очень хорошо без анализа - «поле № 4 - это Example.i»), но я не могу найти два других «инструмента»:

  1. Отладчик, который просматривает сами инструкции (со стеком, дампами памяти и т. Д.), Что позволяет мне исследовать фактический код и среду.
  2. Способ полностью изменить процесс - отредактировать дизассемблированный код и воссоздать файл .class (с отредактированным кодом).

person Ran Biron    schedule 29.03.2010    source источник


Ответы (2)


Я не думаю, что это действительно полный ответ, но несколько указателей, которые могут дать что-то работоспособное:

(1) С точки зрения просмотра и непосредственной работы с байт-кодом старый BCEL Class Construction Kit может быть полезно (это единственный редактор графического интерфейса для байт-кода, о котором я знаю).

(2) Что касается отладки и пошагового выполнения байт-кода, этот плагин Eclipse, который интегрируется с отладчиком Eclipse, может удовлетворить ваши потребности.

Мне не известны какие-либо утилиты, которые объединяли бы эти функции и позволяли вам манипулировать байт-кодом во время выполнения кода (по крайней мере, так же, как вы можете в OllyDbg и т. Д.). Однако API отладчика Java должен быть может поддерживать управление кодом во время выполнения (хотя, учитывая природу HotSpot и JIT в целом, я не знаю, можно ли переписать инструкцию непосредственно перед ее вызовом - текущий исполняемый код операции байт-кода действительно абстракция того, как интерпретатор выбирает реализацию операции, в отличие от машинного кода, где дизассемблированный код операции фактически является инструкцией, отправляемой в ЦП). В качестве альтернативы вы можете изучить Java Инструментальный API, который позволяет переопределить байтовый код во время выполнения. И, конечно же, любая из различных библиотек для обработки байт-кода с открытым исходным кодом может быть может помочь или вдохновить.

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

Суть, однако, заключается в том, что то, что вы, кажется, пытаетесь достичь, хотя и является обычным явлением в мире нативного кода, не является такой уж распространенной практикой в ​​мире Java (отчасти причиной использования Java является абстракция. от всех кровавых подробностей). Это, а также относительно тривиальный характер декомпиляции байтового кода (по сравнению, скажем, с C ++) привели к ситуации, когда этого типа требований мало, как и этого типа инструментов.

person ig0774    schedule 02.04.2010
comment
Вау, отличный ответ. Жалко, что такого инструмента нет. Сомневаюсь, что построю его сам (очень интересно, но давление на работе, в жизни, недостаточное знание предметной области ...). Спасибо за очень полный ответ. - person Ran Biron; 02.04.2010

Взгляните на JAD Decomplier для декомпиляции кода Java. Затем вы можете запустить встроенный отладчик IDE, используя созданные источники. IDE может быть IntelliJ, Eclipse или NetBeans. Этот подход не является полностью автоматическим, но он должен работать.

person Slava Imeshev    schedule 31.03.2010
comment
Не то, что я ищу - пожалуйста, посмотрите мою правку, чтобы получить полный ответ. - person Ran Biron; 31.03.2010
comment
Что ж, тогда ответ такой: такого не существует. - person Slava Imeshev; 01.04.2010
comment
:(. Есть ли способ создать такую ​​штуку? Поддерживает ли это API отладки виртуальной машины? - person Ran Biron; 02.04.2010
comment
Все возможно. Однако, если вы запустите декомпилятор в пакетном режиме, а затем используете созданные исходные коды для отладки, это позволит выполнять отладку с исходным кодом, без каких-либо усилий по разработке. Думаю, обсуждение этого вопроса займет больше времени, чем выполнение :-) - person Slava Imeshev; 03.04.2010