Могу ли я узнать возвращаемое значение перед возвратом во время отладки в Eclipse?

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ctrl + Shift + D

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

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

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

Ответ 3

Вот почему я всегда придерживаюсь следующего шаблона для методов:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Мои правила:

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

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

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

  • Время загрузки, которое требует активации ткачества в виртуальной машине.

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