Есть ли дизассемблер + отладчик для 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"), но я не могу найти два других "инструмента":
- Отладчик, который просматривает сами инструкции (со стеком, дампами памяти и т. Д.), Позволяя мне исследовать реальный код и среду.
- Способ полностью изменить процесс - отредактировать разобранный код и воссоздать файл.class (с отредактированным кодом).
2 ответа
Я не думаю, что это действительно полный ответ, но некоторые указатели, которые могут обеспечить что-то работающее:
(1) С точки зрения просмотра и непосредственной работы с байт-кодом может быть полезен старый BCEL Class Construction Kit (это единственный графический редактор GUI для байт-кода, о котором я знаю).
(2) С точки зрения отладки и пошагового прохождения байт-кода этот плагин Eclipse, который интегрируется с отладчиком Eclipse, может удовлетворить ваши потребности.
Мне неизвестны какие-либо утилиты, которые бы объединяли эти функции и позволяли вам манипулировать байт-кодом во время выполнения кода (по крайней мере, так же, как в OllyDbg и т. Д.). Тем не менее, API отладчика Java должен быть способен поддерживать манипулирование кодом во время выполнения (хотя, учитывая природу HotSpot и JIT в целом, я не знаю, можно ли будет переписать инструкцию непосредственно перед ее вызовом -- исполняемый в настоящее время код операции байт-кода действительно является абстракцией для того, как интерпретатор выбирает реализацию операции, в отличие от нативного кода, где разобранный код операции, на самом деле, является инструкцией, отправляемой в ЦПУ). В качестве альтернативы вы можете обратиться к API инструментария Java, который предоставляет способ переопределения байтового кода во время выполнения. И, конечно, любая из различных библиотек манипулирования байт-кодом с открытым исходным кодом может помочь или вдохновить.
И, конечно же, всегда есть возможность обойти всю инфраструктуру JVM и просто подключить отладчик к процессу JVM. В этом вопросе и на этой странице есть обсуждение этого вопроса.
Суть, однако, в том, что то, что вы, похоже, пытаетесь достичь, хотя и является обычным явлением в мире нативного кода, не так уж часто встречается в практике Java (одна из причин использования Java - абстракция). из всех кровавых подробностей). Это и относительно тривиальная природа декомпиляции байтового кода (по сравнению, скажем, с C++) привели к ситуации, когда требования такого типа недостаточны, как и этот тип инструментов.
Взгляните на JAD Decomplier для декомпиляции кода Java. Затем вы можете запустить встроенный отладчик IDE, используя созданные источники. IDE может быть IntelliJ, Eclipse или NetBeans. Этот подход не является полностью автоматическим, но он должен делать свою работу.