Могу ли я узнать возвращаемое значение перед возвратом во время отладки в Eclipse? - PullRequest
98 голосов
/ 20 октября 2008

Можно ли увидеть возвращаемое значение метода после запуска строки и до возвращения указателя инструкции к вызывающей функции?

Я отлаживаю код, который не могу изменить (читай: не хочу перекомпилировать стороннюю библиотеку) , и иногда он переходит на код, к которому у меня нет исходного кода, или У выражения return есть побочные эффекты, которые не позволяют мне запускать выражение на вкладке Дисплей .

Часто возвращаемое значение используется в составном операторе, и поэтому представление Variables никогда не покажет мне значение (следовательно, желает увидеть результат до того, как управление вернется к вызывающей функции).

ОБНОВЛЕНИЕ: Я не могу использовать средство просмотра выражений, поскольку в выражении есть побочные эффекты.

Ответы [ 9 ]

34 голосов
/ 28 января 2014

Нашел действительно хороший ярлык для этого. Выберите выражение, которое возвращает значение, и нажмите

Ctrl + Shift + D

Это отобразит значение оператора возврата. Это действительно полезно в тех случаях, когда вы не можете или не хотите вносить изменения только в целях отладки.

Надеюсь, это поможет.

Примечание. Не проверялось со сторонними библиотеками, но он хорошо работает для моего кода. Протестировано это в Eclipse Java EE IDE для веб-разработчиков. Версия: Juno Service Release 1

34 голосов
/ 20 января 2009

Эта функция была добавлена ​​в Eclipse версии 4.7 M2 в Ошибка Eclipse 40912 .

Чтобы использовать это:

  • перешагнуть через оператор return (используя «Step Over» или «Step Return»)
  • теперь в первой строке в представлении переменной будет показан результат оператора return, так как "[Statement xxx] возвращено:"

Подробнее см. Проект Eclipse Project Oxygen (4.7) M2 - новый и заслуживающий внимания .

5 голосов
/ 26 декабря 2009

Это на самом деле давняя ошибка в Eclipse, возникшая еще с первых дней существования IDE: https://bugs.eclipse.org/bugs/show_bug.cgi?id=40912

5 голосов
/ 19 ноября 2008

Вот почему я всегда придерживаюсь следующей схемы для методов:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Мои правила:

  1. Только одна инструкция возврата, только в конце метода (наконец, разрешено после него)
  2. Всегда иметь локальный вызываемый результат, который содержит возвращаемое значение, начиная с значения по умолчанию.

Естественно, самые тривиальные добытчики освобождены.

2 голосов
/ 20 октября 2008

Мне интересно узнать и ответ на этот вопрос.

В прошлом, когда я имел дело с такими сторонними библиотеками, я создавал класс-оболочку или дочерний класс, который делегировал родительскому классу, и выполнял отладку в классе-оболочке / дочернем классе. Это требует дополнительной работы.

1 голос
/ 09 января 2019

"Теперь, когда вы возвращаетесь из метода, в верхнем методе в представлении переменной он показывает возвращаемое значение ранее завершенного вызова" [1]

[1] https://coffeeorientedprogramming.wordpress.com/2016/09/23/eclipse-see-return-value-during-debugging/

0 голосов
/ 20 января 2009

Это немного надумано, но, как кажется, не существует простого способа:

Вы можете использовать AspectJ для инструментирования JAR аспектами, которые получают возвращаемое значение интересующих вас методов. Согласно документации Eclipse, программы AspectJ могут быть отлажены , как и другие программы. 1005 *

Существует два варианта создания классов без перекомпиляции библиотеки:

  • Плетение после компиляции, если допустима обработка двоичного JAR;

  • Ткачество во время загрузки, которое требует активации ткацкого агента в ВМ.

См. Документацию по eclipse (ссылка выше), а также Руководство по среде разработки AspectJ .

0 голосов
/ 20 октября 2008

В зависимости от оператора return вы можете выделить выражение, которое возвращается, и в контекстном меню должно быть что-то вроде «оценивать выражение» (сейчас у меня нет затмения, но оно что-то вроде того). Он покажет вам, что будет возвращено.

0 голосов
/ 20 октября 2008

Жесткий. Мой опыт за пределами Eclipse заключается в том, что если вам может понадобиться увидеть возвращаемое значение, лучше назначить его локальной переменной в функции, чтобы оператор возврата был простым return varname;, а не return(some * expression || other);. Однако это не очень полезно для вас, поскольку вы говорите, что не можете (или не хотите) изменять или даже перекомпилировать код. Поэтому у меня нет хорошего ответа для вас - возможно, вам нужно пересмотреть свое требование.

...