Есть ли дизассемблер + отладчик для java (ala 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 - пример .i" ), но я не могу найти два других "инструментария":

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

Ответы

Ответ 1

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

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

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

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

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

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

Ответ 2

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