Есть ли дизассемблер + отладчик для Java (аля OllyDbg / SoftICE для ассемблера)? - PullRequest
16 голосов
/ 29 марта 2010

Есть ли утилита, похожая на 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 (с отредактированным кодом).

Ответы [ 2 ]

12 голосов
/ 02 апреля 2010

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

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

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

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

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

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

2 голосов
/ 31 марта 2010

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

...