Что может быть более точным декомпилятором, чем jad для Eclipse, чтобы избавиться от <-MISALIGNED ->?
Я использовал jad в течение многих лет, большинство из них с плагином Jadclipse для затмения, что делает его вполне пригодным для использования. Особенно с "Align code for debugging", который позволяет вам видеть декомпилированный код для любой строки в трассировке стека. Очень хорошо.
К сожалению, я все больше и больше замечаю, что в него проскакивает комментарий <- MISALIGNED ->, что, скорее всего, связано с тем, что jad ожидает, что файл класса будет в порядке, что явно не относится к библиотеке времени исполнения Java 6. Следовательно, при записи файла, и инструкция говорит "это строка 100", тогда записывается 99 пустых строк, и если затем следующая инструкция говорит "это строка 10", то JAD не может перемотать, чтобы поместить этот вывод туда, а просто печатает комментарий, что это не в том месте.
Вот пример для HttpURLConnection:
protected HttpURLConnection(URL url, Proxy proxy, Handler handler1)
{
/* <-MISALIGNED-> */ /* 603*/ super(url);
/* <-MISALIGNED-> */ /* 192*/ ps = null;
/* <-MISALIGNED-> */ /* 196*/ errorStream = null;
/* <-MISALIGNED-> */ /* 199*/ setUserCookies = true;
/* <-MISALIGNED-> */ /* 200*/ userCookies = null;
/* <-MISALIGNED-> */ /* 220*/ currentProxyCredentials = null;
/* <-MISALIGNED-> */ /* 221*/ currentServerCredentials = null;
/* <-MISALIGNED-> */ /* 222*/ needToCheck = true;
/* <-MISALIGNED-> */ /* 223*/ doingNTLM2ndStage = false;
/* <-MISALIGNED-> */ /* 224*/ doingNTLMp2ndStage = false;
/* <-MISALIGNED-> */ /* 226*/ tryTransparentNTLMServer = NTLMAuthentication.supportsTransparentAuth();
/* <-MISALIGNED-> */ /* 227*/ tryTransparentNTLMProxy = NTLMAuthentication.supportsTransparentAuth();
/
Теперь вопрос в том, есть ли другой декомпилятор, который генерирует более точные выходные данные. Фактическая декомпиляция не обязательно должна быть очень большой или что-то в этом роде, но мне действительно нравится, что она должна быть там, где ожидается представление Java Stack Trace. Если это работает хорошо с Jadclipse, это еще лучше.
3 ответа
Проблема с форматированием для отладки происходит из-за jadclipse
а не из jad
, jad
не имеет такой возможности.
jadclipse
плагин имеет небольшой раздел кода в именах классов DebugAlignWriter
который делает это:
if((align = getAlignTarget(aLine)) != -1)
{
if(align < curLine)
{
if(curLine != 0)
{
out.write(10);
}
out.write("/* <-MISALIGNED-> */ ");
out.write(aLine);
curLine++;
}
else if(align == curLine)
{
out.write(aLine);
}
else
{
for(; align > curLine; curLine++)
{
out.write(10);
}
out.write(aLine);
}
}
В основном он пытается выровнять выход из jad
,
Таким образом, коренная причина в том, что jad
производит вывод, который не обязательно в порядке чтения. К сожалению, я не могу пролить свет на то, почему jad
действует таким образом. В соответствии с jad
Помощь нет способа контролировать заказ.
Я заметил в jadclipse
что если вы установите JadClipse-> Форматирование-> Не вставлять новую строку перед открытием фигурной скобки - это уменьшит количество /* <-MISALIGNED-> */
сегменты из-за характера того, как это работает.
Кроме того, если вы проверили опцию Поля вывода перед методами, это может увеличить количество /* <-MISALIGNED-> */
сегменты, так что избегайте этого.
JD-Eclipse - очень хороший декомпилятор, который также поддерживает функции Java 7.
У него пока нет функции "Выровнять код для отладки", но я добавил ее сам. Я использовал его в течение последнего года.
Я также занимаюсь случаями, когда линия должна быть перемещена назад; Я все еще отмечаю его как MISALIGNED, чтобы обозначить особый случай, но, по крайней мере, он находится на правой линии.
Если кто-то хочет попробовать, его можно скачать отсюда. Более подробная информация внутри README.txt
Я использую jad с минимально возможным форматированием, а затем использую команду форматирования eclipse, так как я могу сделать так, чтобы она соответствовала моему предпочтительному стилю из предпочтений.