Puis-je connaître la valeur de retour avant de retourner lors du débogage dans Visual Studio?

StackOverflow https://stackoverflow.com/questions/268048

Question

Prenez la fonction suivante:

DataTable go() {
    return someTableAdapter.getSomeData();
}

Lorsque je définis un point d'arrêt dans cette fonction, est-il possible d'inspecter la valeur renvoyée? go () est directement couplé à une grille de données dans une page .aspx .

La seule façon d’examiner le datatable retourné est d’utiliser une variable temporaire. Cependant, c'est un peu gênant. N'y a-t-il pas un autre moyen?

Était-ce utile?

La solution

Pas que je sache. Notez que si vous faites ajoutez une variable, elle sera supprimée par le compilateur dans les versions de version de toute façon ...

Mise à jour: Cette fonctionnalité a été ajoutée à VS2013 . Vous pouvez voir les valeurs de retour dans la fenêtre autos ou utiliser $ ReturnValue dans la fenêtre watch / immediate.

La valeur ne peut être vue directement qu'après le retour de la fonction. Le moyen le plus simple d'y accéder est donc de placer un point d'arrêt sur l'appel de la fonction et de passer (F10) à l'appel.

Mise à jour pour VS2015: boo! malheureusement, cela ne semble pas être dans VS2015 (devenv v14)
Mise à jour pour VS2017: c'est le retour. (devenv v15)

Autres conseils

Cela peut être fait dans Visual Studio 2013 avec CLR 4.5.1 selon le site de commentaires des clients . Il n'était pas disponible dans les versions précédentes pour C #.

(Visual & Studio & nbsp; Studio 2008 et versions antérieures le prenaient en charge pour VB.NET. Il a toujours été disponible pour les développeurs C / C ++.)

Je conviens que c’est une chose très utile: avoir non seulement la valeur de retour de la méthode avant d’en sortir, mais également la valeur de retour des méthodes que je viens de franchir. Je l'ai implémenté dans le cadre d'une extension commerciale de Visual Studio appelée " OzCode ".

Grâce à cela, vous pouvez voir les valeurs de retour de méthode directement sur l'éditeur de code, comme une sorte d'affichage HUD:

Visualisation des instructions

Pour plus d'informations, consultez la cette vidéo .

Selon Microsoft, il n’existe aucun moyen de l’implémenter de manière fiable avec du code géré. C’est un problème dont ils ont connaissance et sur lesquels ils travaillent:

  

Pour ceux qui ont de l'expérience en débogage de code C ++ ou VB6 natif, vous avez peut-être utilisé une fonctionnalité dans laquelle les valeurs de retour de fonction vous sont fournies dans la fenêtre Autos. Malheureusement, cette fonctionnalité n'existe pas pour le code géré. Bien que vous puissiez contourner ce problème en affectant les valeurs de retour à une variable locale, cela n’est pas aussi pratique car cela nécessite de modifier votre code.   En code managé, il est beaucoup plus difficile de déterminer la valeur de retour d’une fonction que vous avez dépassée. Nous nous sommes rendus compte que nous ne pouvions pas toujours faire la bonne chose ici et nous avons donc supprimé la fonctionnalité plutôt que de vous donner des résultats incorrects dans le débogueur. Cependant, nous souhaitons vous en informer et nos équipes CLR et Debugger étudient un certain nombre de solutions potentielles à ce problème. Malheureusement, cela ne fera pas partie de Visual Studio 11.

https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net- code

Selon la réponse actuellement acceptée par Marc Gravell:

  

This une fonctionnalité a été ajoutée à Visual & nbsp; Studio & nbsp; 2013 . Vous pouvez voir le retour   valeurs dans les fenêtres autos ou utilisez $ ReturnValue dans la surveillance / immédiate   fenêtre

Cette réponse indiquait également que cette fonctionnalité ne fonctionnait pas dans Visual & Studio 2015. Ce n'est pas (tout à fait) vrai. Sur Examiner les valeurs de retour des appels de méthode il y a la note suivante:

  

Les évaluateurs d'expressions hérités doivent être activés pour que $ ReturnValue soit reconnu (Outils / Options / Débogage / Utiliser les évaluateurs hérités d'expressions C # et VB ). Sinon, vous pouvez utiliser $ ReturnValue1 .

J'ai testé ce programme dans Visual & nbsp; Studio & nbsp; 2015 Enterprise:

  • Avec les évaluateurs d'expressions hérités désactivés: seulement $ ReturnValue1 fonctionne
  • Avec les évaluateurs d'expressions hérités activés: à la fois $ ReturnValue et $ ReturnValue1 travail

Si vous accédez au menu Outils & # 8594; Options , IntelliTrace et modifiez le paramètre pour collecter des événements et des informations sur les appels.

Vous pouvez revenir à l'événement d'appel précédent ( Ctrl + Maj + F11 ) et voir la valeur temporaire renvoyée par l'appel de la méthode. dans la fenêtre autos en tant qu'enfant du nom de la méthode.

Ceci ne vous montre pas la valeur de retour pour la méthode dans laquelle vous vous trouvez. Il vous montre simplement la valeur de retour de la dernière méthode appelée dans la méthode en cours.

Donc, ça va pour

DataTable go(){return someTableAdapter.getSomeData();}

car il vous montre la valeur de retour pour someTableAdapter.getSomeData () .

Mais pas pour:

int go(){return 100 * 99;}

Ancien truc des années antérieures à .NET: Ouvrez la fenêtre Registres et examinez la valeur du registre EAX. Ceci contient la valeur de retour de la dernière fonction appelée.

Quittez la méthode go () à l'aide de Shift-F11, puis dans l’option "Autos". La fenêtre de débogage affichera la valeur de retour de l’appel à la méthode qui vient de sortir de la pile (dans ce cas, la méthode go () qui vous convient). C'est le comportement dans Visual Studio 2005; Je n'ai pas utilisé Visual Studio 2008, donc je ne sais pas si cela se comporte de la même manière dans cette version.

Oui, il existe un très bon moyen. Un inconvénient majeur est que vous devrez attendre 5, voire 6 ans. Depuis que je vois que vous avez posté en novembre 2008, je vous suggère de waaaaaa ...

... aaaait. Et voilà! Juste pour vous, MS vient de publier la dernière Visual Studio 2013 , une fonctionnalité par défaut accessible à partir des menus lors de l'exécution en mode débogage (menu Débogage . ? Windows ? Autos ).

Il existe de nombreuses solutions de contournement, mais aucune ne semble satisfaisante.

Pour citer John Skeet ci-dessous (commentez une réponse maintenant supprimée):

  

me semble toujours gênant -   surtout si vous ne savez pas lequel   valeur de retour dont vous aurez besoin   avant de commencer le débogage. Je vraiment   ne veulent pas avoir un temporaire   variable encombrant mon code tous les   temps je reviens jamais quelque chose.t

En théorie, le débogueur pourrait avoir une variable return . Après tout: c'est juste une variable sur la pile:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

Considérez ceci comme une demande de fonctionnalité pour Visual Studio.

Microsoft Visual C ++ le faisait auparavant, mais Visual Studio ne s'en souvient pas ..: (

Le seul moyen que je connaisse est de placer un point d'arrêt sur la ligne de retour, puis d'appeler la fenêtre Quick Watch et d'entrer l'expression renvoyée:

someTableAdapter.getSomeData();

Mais cela ne fonctionne que si l'appel ne change pas l'état d'un objet (puisqu'il y aura un deuxième appel à la même méthode lorsque vous reprendrez l'exécution).

Je voulais développer Réponse de PascalK pour que cela fonctionne dans Visual Studio & 2015, car il existe une fonctionnalité masquée qui n'est pas documentée dans Examiner les valeurs renvoyées pour les appels de méthode .

Si vous avez des appels de fonction imbriqués, les pseudo-variables $ ResultValueX sont automatiquement créées, X correspondant à l'ordre d'appel des fonctions. Ainsi, si vous avez un appel tel que Multiplier (Cinq (), Six ()) , les pseudo-variables suivantes sont créées:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

Vous pouvez également demander à évaluer la valeur dans la fenêtre intermédiaire, si elle ne définit pas d'indicateurs ou d'autres variables, mais ne renvoie que quelque chose.

Je pense que vous pouvez le déterminer en consultant le registre RAX dans la fenêtre Registres (Debug / Windows / Registers). Après avoir quitté (SHIFT + F11) de la fonction, vérifiez le registre RAX. Je ne sais pas pour un fait, mais une fois sur la lune, vous pouvez vérifier un registre (avant les jours .NET) et y voir la valeur de retour. Ce pourrait même être une combinaison de RAX et RBX, etc.

Ouverture du débogage & # 8594; La fenêtre Autos vous rapproche. Elle ne montrera pas la valeur de retour réelle, mais indiquera ce qui a été évalué dans la déclaration de retour.

Oui, en passant à VB.NET. ; P (vous venez de dire "Visual Studio".;)

Pour autant que je me souvienne (de Visual Basic à toutes les versions de VB.NET), vous pouvez simplement interroger le nom de la fonction. Il " fonctionne " comme une variable locale qui est implicitement déclarée au début de la fonction et dont la valeur actuelle est également utilisée comme valeur de retour à chaque fois que la fonction quitte via des instructions non renvoyées (c.-à-d. Exit Function ou qui passe juste à travers) et bien sûr, lorsque l'instruction return est utilisée.

Il est également défini sur l'expression de l'instruction return. Tout comme une variable locale, sa valeur peut être inspectée à tout moment de l'exécution dans la fonction (y compris après l'exécution de l'instruction return). C # n’a pas cela et devrait.

Cette petite fonctionnalité VB.NET (plus l’instruction Exit Function qu’elle active - une autre fonctionnalité que C # n’a pas et devrait avoir) est très utile dans une forme de programmation défensive Je m'entraîne à initialiser toujours le nom de la fonction sur la valeur d'échec / par défaut en tant que première instruction. Ensuite, à n'importe quel point d'échec (ce qui se produit normalement beaucoup plus souvent que les points de réussite), je peux simplement appeler l'instruction Exit Function (c'est-à-dire sans avoir à dupliquer l'expression échec / défaut ou même une constante / variable nom).

La réponse acceptée ne fonctionne pas correctement avec Visual & Studio & 2015 mais vous devez placer un point d'arrêt sur la dernière ligne de la méthode et appuyer sur F10 pour que tous les expressions de la valeur de retour dans la fenêtre locale.

Vous pouvez essayer de sélectionner "someTableAdapter.getSomeData ();" ), cliquez dessus avec le bouton droit de la souris et sélectionnez Quick Watch .

.

Faites glisser l’expression de retour dans une fenêtre de suivi.

Par exemple, dans la déclaration

return someTableAdapter.getSomeData();

glisser-déposer

someTableAdapter.getSomeData()

dans une fenêtre de surveillance, et vous verrez la valeur.

Vous pouvez le faire pour n'importe quelle expression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top