Чи можу я дізнатися значення повернення перед поверненням під час налагодження в Eclipse?


99

Чи можливо побачити значення повернення методу після запуску рядка і до того, як покажчик інструкції повернеться до викликової функції?

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

Часто значення повернення використовується в складеному операторі, і тому перегляд змінних ніколи не покаже мені значення (отже, бажаючи побачити результат, перш ніж контроль повернеться до функції виклику).

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


7
Ось чому я перейшов на версію спільноти IntelliJ - люди Eclipse просто не здаються зрозумітими, наскільки це важливо. (Якщо вони коли-небудь це виправлять, я повернусь до дня його виходу.)

@James Mitchell це виглядає як чудова ідея для плагіна. Я додаю його до списку todo і спробую це зробити, коли знайду час (не скоро)
IAdapter

@ user672348 Але як це зробити в IntelliJ IDEA?
Олексій Тигарев

@AlexeyTigarev: IIRC, він просто відображається, коли ви робите "Step Step" (або еквівалент).
Blaisorblade

1
Підготуйте себе за Eclipse Oxygen (середина 2017 року випуску). Віха M2 включає цю особливість .
Абдул

Відповіді:


36

Ця функція була додана до Eclipse версії 4.7 M2 під програмою Eclipse 40912 .

Щоб використовувати його:

  • перехід через returnоператор (використовуючи "Крок понад" або "Повернення кроку")
  • тепер перший рядок у змінному вікні покаже результат оператора return, оскільки "[твердження xxx] повернуто:"

Дивіться проект Eclipse Oxygen (4.7) M2 - новий та заслуговуючи уваги для деталей.


Я також. Я пропускаю цю функцію під час використання Eclipse.
m24p

1
Потім ця помилка Eclipse була знову відкрита в кінці 2009 року . Все ще чекаю виправлення, хоча ніхто не призначив і не має цільової віхи. :)
Марк А. Фіцджеральд

1
Це було зафіксовано в останніх складаннях Eclipse 4.7 (M2 і далі)
AbdullahC

1
Деякі відомості про те, як використовувати виправлення, ви знайдете у Новому та Заслуговує уваги на 4.7 M2. Шукайте "Результат методу після крокових операцій" тут: eclipse.org/eclipse/news/4.7/M2
Джошуа Голдберг

@JoshuaGoldberg: Дякую, що вказав на це - я відредагував це у відповідь.
sleske

34

Знайшов дійсно хороший ярлик для цього. Виберіть вираз, який повертає значення, і натисніть

Ctrl + Shift + D

Це відобразить значення оператора return. Це дуже корисно у випадках, коли ви не можете або не хочете змінитись лише з метою налагодження.

Сподіваюся, це допомагає.

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


4
+1, тому що це працює не тільки для повернених значень, але і для виразів загалом. Набагато зручніше, ніж використання вкладки виразів. Слід зазначити, що це виконує код, тому якщо він має побічні ефекти, будьте обережні. help.eclipse.org/indigo/…
козел

1
Ctrl + Shift + Iмені також було корисно.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
як згадується @goat, він виконує код кілька разів, тому, наприклад, якщо функція зробила це return System.currentTimeMillis();, то ви отримаєте інший результат, ніж функція фактично повернулася!
Бред Паркс

Еквівалент на Apple machine?
Адріан Бе

Це проблемна порада - це переоцінить вираз, який може бути згубним, якщо він має побічні ефекти.
sleske


5

Ось чому я завжди дотримуюся такої схеми методів:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Мої правила:

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

Природно, звільняються найбільш тривіальні геттери.


3
Привіт zvikico - коли я працюю над власним кодом, я зазвичай використовую подібний зразок. На жаль, моя проблема полягає в тому, що я використовую код, який не записується і не змінюється. : S
RodeoClown

Я роблю це теж, але SonarLint скаржиться .... тепер я половинчастий: stackoverflow.com/questions/31733811 / ...
HDave

@WitoldKaczurba це ваша думка, і це добре. Просто прийміть, що існують інші думки, і проявіть певну повагу до тих, хто це робить.
zvikico

Привіт, zvikco. Дякуємо за повідомлення Я погоджуюся, що існують різні підходи, але я посилався на pmd.sourceforge.io/pmd-4.3.0/rules/… . Ура
Вітольд Качурба

2

Мені цікаво також дізнатися відповідь на це питання.

Раніше, маючи справу з третьою стороною бібліотекою, я робив це, щоб створити клас обгортки або дочірній клас, який делегуватимуть до батьківського класу та робити налагодження в класі обгортки / дитини. Але це займає додаткову роботу.


1
Проблема цього рішення (крім тієї, яку ви відзначили про додаткову роботу) полягає в тому, що воно працює лише в тому випадку, якщо у вас немає декількох класів / методів, які знаходяться всередині зовнішньої бібліотеки. Але це корисно, коли ви маєте справу з зовнішнім шаром методів.
RodeoClown


0

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


У моєму коді, як правило, є проміжний крок, щоб я міг перевірити результат, але деякий код, який я використовую, має занадто багато організаційних накладних витрат, щоб змінити (наприклад, якщо бібліотека оновлюється, не дуже хочеться підтримувати роздвоєну версію просто для налагодження).
RodeoClown

0

Залежно від заяви повернення, ви можете виділити вираз, який повертається, і в меню правою кнопкою миші повинно бути щось на кшталт "Оцінити вираз" (у мене зараз немає затемнення, але це щось подібне ). Це покаже вам, що буде повернуто.


4
Проблема полягає в тому, що при оцінці функції повернення є побічні ефекти (як, наприклад, записи бази даних, що створюються, наприклад), оцінка вираження повернення змінить стан системи. Дякую за пропозицію, хоча.
RodeoClown

0

Це трохи надумано, але, як здається, не простий спосіб:

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

Є два варіанти плетіння класів без перекомпіляції бібліотеки:

  • Після складання плетіння, якщо обробка двійкового JAR прийнятна;

  • Плетіння в часі навантаження, що вимагає активації ткацького агента у ВМ.

Дивіться документацію про затемнення (посилання вище), а також посібник з навколишнього середовища розвитку AspectJ .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.