Что может быть более точным декомпилятором, чем 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, так как я могу сделать так, чтобы она соответствовала моему предпочтительному стилю из предпочтений.

Другие вопросы по тегам