Puis-je trouver la valeur de retour avant de revenir pendant le débogage dans Visual Studio?

prendre la fonction suivante:

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

quand je mets un point de rupture dans cette fonction, est-il possible d'inspecter la valeur retournée? go() est directement couplé à un datagrid dans une page .aspx .

la seule façon d'inspecter le datatable retourné est d'utiliser une variable temporaire. Cependant, c'est un peu gênant. N'est-il pas un autre moyen?

334
demandé sur Peter Mortensen 2008-11-06 12:24:43

20 réponses

Pas que je sache. Notez que si vous do ajouter une variable, elle sera supprimée par le compilateur dans les compilations release 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 vu directement après le retour de la fonction, donc la façon la plus simple d'y accéder est de mettre un point de rupture sur l'appel de la fonction et d'enjamber (F10) l'appel.


mise à jour pour VS2015: boo! malheureusement, il ne semble pas être dans VS2015 (devenv v14)

211
répondu Marc Gravell 2016-03-04 12:59:44

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

(Visual Studio 2008 et antérieur soutenu pour VB.NET. Il a toujours été disponible pour les développeurs C/C++.)

58
répondu Alex Angas 2018-01-15 22:56:00

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

avec cela, vous pouvez afficher les valeurs de retour de méthode directement sur l'éditeur de code, comme une sorte de HUD-display:

Statement Visualization

Pour plus d'informations, veuillez consulter

25
répondu Omer Raviv 2016-08-30 07:00:54

selon Microsoft, il n'y a aucun moyen de mettre en œuvre cela de manière fiable avec le code géré. C'est un problème qu'ils connaissent et travaillent sur:

pour ceux qui ont de l'expérience dans le débogage du code natif C++ ou VB6, vous pouvez avoir utilisé une fonctionnalité où les valeurs de retour de fonction sont fournies pour vous dans la fenêtre Autos. Malheureusement, cette fonctionnalité n'existe pas pour le code managé. Alors que vous pouvez travailler autour de cette question en assignant retourner des valeurs à une variable locale, ce n'est pas aussi pratique car cela nécessite de modifier votre code. En managed code, il est beaucoup plus difficile de déterminer la valeur de retour d'une fonction que vous avez dépassée. Nous avons réalisé que nous ne pouvions pas faire la bonne chose de manière cohérente ici et donc nous avons supprimé la fonctionnalité plutôt que de vous donner des résultats incorrects dans le débogueur. Cependant, nous voulons vous le rapporter, car nos équipes CLR et Debugger étudient un certain nombre de solutions possibles à ce problème. Malheureusement, il 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

21
répondu Dan Solovay 2012-06-17 14:33:15

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

cette fonctionnalité a été ajoutée à Visual Studio 2013 . Vous pouvez voir le retour valeurs dans les fenêtres autos ou utilisez $ReturnValue dans la montre / immediate fenêtre

cette réponse indiquait également que cette fonctionnalité ne fonctionnait pas dans Visual Studio 2015. Ce n'est pas entièrement vrai. Sur Examiner valeurs de retour des appels de méthode il y a la note suivante:

vous devez avoir l'expression legacy evaluators activée pour $ReturnValue pour être reconnu (Outils / Options / Débogage / utiliser l'expression legacy C# et VB evaluators ). Sinon, vous pouvez utiliser $ReturnValue1 .

j'ai testé cela dans Visual Studio 2015 Entreprise:

  • Avec l'héritage de l'expression des évaluateurs éteint: seulement $ReturnValue1 œuvres
  • Avec l'héritage de l'expression des évaluateurs allumé: les deux $ReturnValue et $ReturnValue1 travail
18
répondu PascalK 2018-01-15 23:11:24

si vous allez au menu outils Options , IntelliTrace, et changer le réglage pour collecter des événements et des informations d'appel.

vous pouvez revenir à l'événement d'appel précédent ( Ctrl + Shift + F11 ) et voir la valeur temporaire retournée de l'appel de méthode dans la fenêtre autos comme un enfant du nom de la méthode.

This ne vous montre pas la valeur de retour pour la méthode dans laquelle vous êtes. Cela vous montre la valeur de retour de la dernière méthode appelée dans la méthode actuelle.

Donc, c'est bien pour les

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

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

mais pas pour:

int go(){return 100 * 99;}
12
répondu Ross Buggins 2018-01-15 22:58:51

vieux truc des pré. net days: ouvrez la fenêtre des registres et regardez la valeur du registre EAX. Il contient la valeur de retour de la dernière fonction appelée.

11
répondu ColinM 2018-01-15 23:00:28

Étape de la méthode go() à l'aide de Maj + F11, puis dans les "Autos" fenêtre de débogage, il affichera la valeur de retour de l'appel de la méthode qui a juste sauté hors de la pile (dans ce cas, la méthode go() qui est ce que vous voulez). 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 façon dans cette version.

8
répondu LeopardSkinPillBoxHat 2008-11-06 09:53:04

Oui, il y a une façon très agréable. Un inconvénient important est que vous devez attendre 5, peut-être 6 ans. Puisque je vois que vous avez posté en novembre 2008, je suggère que vous waaaaaa...

...aaaait. Et voilà!! Juste pour vous, MS a publié le dernier Visual Studio 2013 où il est une fonctionnalité par défaut accessible à partir des menus tout en exécutant en mode de débogage (menu débogage Windows Autos ).

6
répondu Konrad Viltersten 2018-01-15 23:09:15

Il y a beaucoup de solutions, mais aucune ne semble satisfaisante.

pour citer John Skeet ci-dessous (commentaire sur une réponse maintenant supprimée):

me semble toujours incommode - surtout si vous ne savez pas qui valeur de retour dont vous aurez besoin avant de démarrer le débogage. J'ai vraiment ne voulez pas avoir à être temporairement variable encombrant mon code chaque fois que je retourne jamais rien.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));
  }
}

alors considérez ceci comme une requête de fonctionnalité pour Visual Studio.

5
répondu doekman 2018-01-15 22:55:03

Microsoft Visual C++ avait l'habitude de faire cela, mais Visual Studio N'a pas L'habitude.. : (

2
répondu Sprintstar 2010-06-16 10:52:41

le seul moyen que je connaisse est de placer un point de rupture sur la ligne de retour, puis appeler la fenêtre Quick Watch et entrer l'expression retournée:

someTableAdapter.getSomeData();

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

2
répondu Sylvain Rodrigue 2018-01-15 22:51:29

j'ai voulu développer sur réponse de PascalK pour obtenir ceci à travailler dans Visual Studio 2015, parce qu'il y a une caractéristique cachée qui n'est pas documentée dans examiner les valeurs de retour des appels de méthode .

si vous avez des appels de fonction imbriqués, les pseudo-variables $ResultValueX sont créées automatiquement, où le X se réfère à l'ordre d'appel de fonction. Donc, si vous avez un appel comme Multiply(Five(), Six()) , les pseudo-variables suivantes sont créées:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30
2
répondu splttingatms 2018-01-15 23:14:59

vous pouvez également demander d'évaluer la valeur dans la fenêtre intermédiaire, si elle ne définit pas de drapeaux ou d'autres variables, mais renvoie seulement quelque chose.

1
répondu Biri 2008-11-06 09:42:39

je pense que vous pouvez déterminer ceci en regardant le registre RAX dans la fenêtre Registers (Debug / Windows / Registers). Après la sortie (SHIFT + F11) de la fonction, vérifiez le registre RAX. Je ne sais pas pour un fait, mais une fois sur une lune vous pourriez vérifier un registre (pré.net days) et voir la valeur de retour là. Il peut même s'agir d'une combinaison de RAX et RBX, etc.

1
répondu Joe Rattz 2013-07-11 20:48:28

ouvrir la fenêtre Debug → Autos vous permet de fermer. Il ne montrera pas la valeur de retour réelle, mais il montrera ce qui a été évalué dans la déclaration de retour.

1
répondu GeekyMonkey 2018-01-15 22:49:39

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

aussi longtemps que je me souviens (de Visual Basic à travers 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 sa valeur actuelle est également utilisée comme valeur de retour chaque fois que la fonction sort par l'intermédiaire de l'instruction de non-retour signifie (i.e. Exit Function ou juste tomber à travers) et de bien sûr, quand le rapport de retour est utilisé.

il est aussi défini à l'expression de la déclaration de retour. Tout comme une variable locale, sa valeur peut être inspectée à n'importe quel point d'exécution à l'intérieur de la fonction (y compris après que l'instruction de retour est exécutée). C# n'a pas ça et devrait.

ce petit VB.NET feature (plus la déclaration Exit Function qu'il active - une autre caractéristique C# n'a pas et devrait) est très utile sous une forme de defensive programming je pratique où j'initialise toujours le nom de la fonction à la valeur d'échec/défaut comme premier énoncé. Ensuite, à n'importe quel point d'échec (qui se produit normalement beaucoup plus souvent que les points de succès), je peux simplement appeler la déclaration Exit Function (c.-à-d. sans avoir à dupliquer l'expression d'échec / défaut ou même un nom de constante/variable).

1
répondu Tom 2018-01-15 23:07:08

la réponse acceptée ne fonctionne pas correctement avec Visual Studio 2015, mais en plaçant un point de rupture sur la dernière ligne de la méthode et en appuyant sur F10 , il mettra toutes les expressions de la valeur de retour dans la fenêtre locale.

1
répondu Esben Skov Pedersen 2018-01-15 23:31:44

Vous pouvez essayer de sélectionner "someTableAdapter.getSomeData();" , cliquez droit sur elle, et aller pour espion .

0
répondu Yann Semet 2018-01-15 22:47:14

faites glisser et déposez l'expression de retour dans une fenêtre de montre.

par exemple, dans la mention

return someTableAdapter.getSomeData();

glisser-déposer

someTableAdapter.getSomeData()

dans une fenêtre d'observation, et vous verrez la valeur.

Vous pouvez le faire pour n'importe quelle expression.

-1
répondu Pita.O 2018-01-15 22:52:37