Puis-je trouver la valeur de retour avant de retourner lors du débogage dans Eclipse?

99

Est-il possible de voir la valeur de retour d'une méthode après l'exécution de la ligne et avant que le pointeur d'instruction ne retourne à la fonction appelante?

Je débogue du code que je ne peux pas modifier (lire: je ne veux pas recompiler une bibliothèque tierce) , et parfois il saute au code vers lequel je n'ai pas de source ou l'expression de retour a des effets secondaires qui m'empêchent d'être capable d'exécuter simplement l'expression dans l' onglet Affichage .

Souvent, la valeur de retour est utilisée dans une instruction composée, et donc la vue Variables ne me montrera jamais la valeur (par conséquent, je veux voir le résultat avant que le contrôle ne retourne à la fonction appelante).

MISE À JOUR: Je ne peux pas utiliser la visionneuse d'expression car il y a des effets secondaires dans la déclaration.

RodéoClown
la source
7
C'est pourquoi je suis passé à la version communautaire d'IntelliJ - les gens d'Eclipse ne semblent tout simplement pas comprendre à quel point cela est important. (S'ils le réparent, je reviendrai le jour de sa sortie.)
@James Mitchell cela ressemble à une excellente idée pour un plugin. Je vais l'ajouter à ma liste de tâches et j'essaierai de le faire quand j'aurai le temps (pas bientôt)
IAdapter
@ user672348 Mais comment faire cela dans IntelliJ IDEA?
Alexey Tigarev
@AlexeyTigarev: IIRC, il est juste affiché lorsque vous faites "Step Return" (ou l'équivalent).
Blaisorblade
1
Préparez-vous pour Eclipse Oxygen (date de sortie mi-2017). Le jalon M2 inclut cette fonctionnalité .
Abdull

Réponses:

36

Cette fonctionnalité a été ajoutée à Eclipse version 4.7 M2 sous le bogue Eclipse 40912 .

Pour l'utiliser:

  • pas à pas sur l' returninstruction (en utilisant "Step Over" ou "Step Return")
  • maintenant, la première ligne de la vue des variables affichera le résultat de l'instruction return, comme "[instruction xxx] retournée:"

Voir Eclipse Project Oxygen (4.7) M2 - New and Noteworthy pour plus de détails.

sleske
la source
Moi aussi. Cette fonctionnalité me manque lors de l'utilisation d'Eclipse.
m24p
1
Ce bogue Eclipse a ensuite été rouvert fin 2009 . En attente d'un correctif, cependant, sans personne assigné et sans objectif cible. :)
Mark A. Fitzgerald
1
Ce problème a été corrigé dans les versions récentes d'Eclipse 4.7 (à partir de M2)
AbdullahC
1
Certaines informations sur l'utilisation du correctif se trouvent dans le nouveau et remarquable pour 4.7 M2. Recherchez "Résultat de la méthode après les opérations d'étape" ici: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg
@JoshuaGoldberg: Merci de l'avoir signalé - je l'ai modifié dans la réponse.
sleske
34

J'ai trouvé un très bon raccourci pour cela. Sélectionnez l'expression qui renvoie la valeur et appuyez sur

Ctrl + Shift + D

Cela affichera la valeur de l'instruction return. Ceci est vraiment utile dans les cas où vous ne pouvez pas ou ne voulez pas changer uniquement à des fins de débogage.

J'espère que cela t'aides.

Remarque: je n'ai pas testé cela avec des bibliothèques tierces, mais cela fonctionne bien pour mon code. Testé sur Eclipse Java EE IDE pour les développeurs Web. Version: Juno Service Release 1

Satish
la source
4
+1 car cela fonctionne non seulement pour les valeurs de retour, mais pour les expressions en général. Beaucoup plus pratique que d'utiliser l'onglet expressions. Il convient de noter que cela exécute le code, donc si cela a des effets secondaires, méfiez-vous. help.eclipse.org/indigo/…
chèvre
1
Ctrl + Shift + Ia également été utile pour moi.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
comme @goat l'a mentionné, cela exécute le code plusieurs fois, donc par exemple, si la fonction le faisait return System.currentTimeMillis();, vous obtiendriez un résultat différent de celui de la fonction réellement retournée!
Brad Parks
Équivalent sur un Apple machine?
Adrien Be
C'est un conseil problématique - cela réévaluera l'expression, ce qui peut être désastreux si elle a des effets secondaires.
sleske
5

C'est pourquoi je m'en tiens toujours au modèle suivant pour les méthodes:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Mes règles:

  1. Une seule instruction de retour, uniquement à la fin de la méthode (finalement autorisée après celle-ci)
  2. Ayez toujours un résultat appelé local qui contient la valeur retournée, en commençant par une valeur par défaut.

Naturellement, les getters les plus triviaux sont exemptés.

zvikico
la source
3
Hey zvikico - lorsque je travaille sur mon propre code, j'utilise généralement un modèle similaire. Malheureusement, mon problème est lorsque j'utilise du code qui n'est pas écrit ou modifiable par moi. : S
RodeoClown
Je fais cela aussi, mais SonarLint se plaint .... maintenant je suis équivoque: stackoverflow.com/questions/31733811/…
HDave
@WitoldKaczurba c'est votre opinion, et c'est très bien. Acceptez simplement qu'il existe d'autres opinions et montrez du respect à ceux qui le font.
zvikico
Salut zvikco. Merci pour le message. J'accepte qu'il existe différentes approches mais j'ai fait référence à pmd.sourceforge.io/pmd-4.3.0/rules/… . Cheers
Witold Kaczurba
2

Je suis curieux d'apprendre la réponse à cette question également.

Dans le passé, lorsque je traitais avec une bibliothèque tierce comme celle-là, ce que je faisais était de créer une classe wrapper ou une classe enfant qui déléguait à la classe parent et faisait mon débogage dans la classe wrapper / child. Cela demande cependant du travail supplémentaire.

DJ.
la source
1
Le problème avec cette solution (en dehors de celle que vous avez notée à propos du travail supplémentaire) est qu'elle ne fonctionne que si vous n'êtes pas plusieurs classes / méthodes au cœur d'une bibliothèque externe. Mais c'est utile lorsque vous traitez avec la couche externe des méthodes.
RodeoClown
0

Dur. Mon expérience, en dehors d'Eclipse, est que si vous avez besoin de voir la valeur de retour, il est préférable de l'attribuer à une variable locale dans la fonction afin que l'instruction de retour soit simple return varname;et non return(some * expression || other);. Cependant, cela ne vous aide pas terriblement puisque vous dites que vous ne pouvez pas (ou ne voulez pas) modifier ou même recompiler le code. Donc, je n'ai pas de bonne réponse pour vous - peut-être devez-vous reconsidérer votre exigence.

Jonathan Leffler
la source
Dans mon code, j'ai généralement l'étape intermédiaire pour que je puisse vérifier le résultat, mais une partie du code que j'utilise a trop de surcharge organisationnelle à modifier (en particulier si la bibliothèque est mise à jour, je ne veux pas vraiment maintenir une version fourchue juste pour le débogage).
RodeoClown
0

En fonction de l'instruction de retour, vous pouvez mettre en évidence l'expression qui est renvoyée et dans le menu contextuel, il devrait y avoir quelque chose comme "évaluer l'expression" (je n'ai pas d'éclipse devant moi maintenant, mais c'est quelque chose comme ça ). Il vous montrera ce qui va être retourné.

stephmara
la source
4
Le problème est que lorsque l'évaluation de la fonction de retour a des effets secondaires (comme des entrées de base de données créées par exemple), l'évaluation de l'expression de retour changera l'état du système. Merci pour la suggestion.
RodeoClown
0

C'est un peu tiré par les cheveux, mais comme il ne semble pas y avoir de moyen simple:

Vous pouvez utiliser AspectJ pour instrumenter le JAR avec des aspects qui récupèrent la valeur de retour des méthodes qui vous intéressent. Selon la documentation d'Eclipse, les programmes AspectJ peuvent être débogués comme d'autres programmes.

Il existe deux options pour tisser vos classes sans recompiler la bibliothèque:

  • Tissage post-compilation si le traitement du JAR binaire est acceptable;

  • Tissage au chargement, qui nécessite l'activation d'un agent de tissage dans la VM.

Voir la documentation eclipse (lien ci-dessus) ainsi que le Guide de l'environnement de développement AspectJ .

Olivier
la source