web-dev-qa-db-fra.com

Puis-je connaître la valeur de retour avant de revenir lors du débogage dans Eclipse?

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 revienne à 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 passe au code Je n'ai pas de source ou l'expression de retour a des effets secondaires qui m'empêchent de simplement exécuter 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 (donc vouloir voir le résultat avant le retour du contrôle) à la fonction appelante).

PDATE: Je ne peux pas utiliser la visionneuse d'expression car il y a des effets secondaires dans l'instruction.

98
RodeoClown

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

Pour l'utiliser:

  • passer par-dessus l'instruction return (en utilisant "Step Over" ou "Step Return")
  • maintenant la première ligne dans la vue variable montrera le résultat de l'instruction de retour, comme "[instruction xxx] retourné:"

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

35
Daniel Meyer

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 de retour. C'est vraiment utile dans les cas où vous ne pouvez pas ou ne voulez pas changer juste à 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

34
Satish

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 (enfin autorisée après)
  2. Ayez toujours un résultat appelé local qui contient la valeur retournée, en commençant par défaut.

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

5
zvikico

Il s'agit en fait d'un bogue de longue date dans Eclipse, remontant aux tout premiers jours de l'IDE: https://bugs.Eclipse.org/bugs/show_bug.cgi?id=40912

5
Arjan Tijms

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

Dans le passé, lorsque je traitais avec une bibliothèque tierce comme ça, ce que je faisais est de créer une classe wrapper ou une classe enfant qui délègue à la classe parent et fais mon débogage dans la classe wrapper/enfant. Mais cela demande du travail supplémentaire.

2
DJ.

"Maintenant, lorsque vous revenez d'une méthode, dans la méthode supérieure, dans la vue variable, elle affiche la valeur de retour de l'appel précédemment terminé"

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

1
ejaenv

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 saisissent 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 les autres programmes.

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

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

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

Voir la documentation Eclipse (lien ci-dessus) ainsi que le AspectJ Development Environment Guide .

0
Olivier

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'affecter à une variable locale dans la fonction afin que l'instruction de retour soit un simple return varname; Et non return(some * expression || other);. Cependant, cela ne vous est pas terriblement utile car 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.

0
Jonathan Leffler

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

0
stephmara