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

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

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

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

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

8 ответов


эта функция была добавлена в Eclipse версии 4.7 M2 под ошибка затмения 40912.


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

Ctrl + Shift + D

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

надеюсь, что это помогает.

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


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

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

мои правила:

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

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


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


Мне любопытно узнать ответ на этот вопрос.

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


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


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


Это немного притянуто за уши, но поскольку, похоже, нет простого способа:

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

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

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

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

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