Что может быть более точным декомпилятором, чем jad для Eclipse, чтобы избавиться от <-MISALIGNED ->? - PullRequest
4 голосов
/ 10 сентября 2010

Я использовал 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 ]

2 голосов
/ 25 мая 2011

Проблема с форматированием для отладки возникает из 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-> */ сегментов, поэтому избегайте этого.

1 голос
/ 01 июня 2012

JD-Eclipse - очень хороший декомпилятор, который также поддерживает функции Java 7.

У него пока нет функции «Выровнять код для отладки», но я сам добавил ее.Я использовал его в течение прошлого года.

Я также занимаюсь случаями, когда линия должна быть перемещена назад;Я все еще помечаю его как MISALIGNED для обозначения особого случая, но, по крайней мере, он расположен в правой строке.

Если кто-то захочет попробовать, его можно скачать с здесь .Более подробная информация внутри README.txt

0 голосов
/ 10 сентября 2010

Я использую jad с минимально возможным форматированием, а затем использую команду форматирования eclipse, так как я могу сделать так, чтобы она соответствовала моему предпочтительному стилю из настроек.

...