Copier les valeurs d'objet en mode débogage de Visual Studio


138

En mode de débogage de Visual Studio, il est possible de survoler les variables pour afficher leur valeur, puis de cliquer avec le bouton droit sur «Copier», «Copier l'expression» ou «Copier la valeur».

Dans le cas où la variable est un objet et pas seulement un type de base, il y a un signe + pour développer et explorer l'objet. Y a-t-il un moyen de copier tout cela dans le presse-papiers?

Réponses:


192

Dans la fenêtre immédiate, tapez

?name_of_variable

Cela imprimera tout et vous pourrez le copier manuellement où vous le souhaitez, ou utiliser les fonctionnalités de journalisation de la fenêtre immédiate pour l'écrire automatiquement dans un fichier.

MISE À JOUR : Je suppose que vous demandiez comment copier / coller la structure imbriquée des valeurs afin que vous puissiez soit la rechercher textuellement, soit l'enregistrer sur le côté, puis comparer l'état de l'objet à celui-ci. Si j'ai raison, vous voudrez peut-être consulter l'extension commerciale de Visual Studio que j'ai créée, appelée OzCode , qui vous permet de faire ces choses beaucoup plus facilement grâce aux fonctionnalités «Rechercher» et «Comparer».

MISE À JOUR 2 Pour répondre à la question de @ ppumkin, ou le nouvel EAP a une nouvelle fonction d'exportation qui permet aux utilisateurs d'exporter les valeurs des variables vers du code Json, XML, Excel ou C #.

Divulgation complète: je suis le co-créateur de l'outil que j'ai décrit ici.


5
Cela aurait été encore mieux s'il pouvait s'étendre de manière récursive pour tout montrer. Il pourrait s'agir de beaucoup de texte mais je serais alors peut-être le chercher pour une valeur plus profonde dans l'arbre.
Kobus Smit

3
PS J'adore les fonctionnalités de bugaid. le téléchargement du sentier maintenant et quand il expire et que je commence à jauger mes globes oculaires, mon patron l'achètera pour moi .. :)
Piotr Kula

16
Quelqu'un sait comment produire plus de 100 éléments? Je reçois ceci après que les 100 premiers aient été affichés dans la fenêtre Immédiat: <Plus ... (Les 100 premiers éléments sur 335 ont été affichés.)>
lachs

6
Qu'entend-on exactement par "la fenêtre immédiate"?
alex

3
@alex: dans Visual Studio, accédez à Déboguer> Windows> Immédiat - Il vous permet de saisir des expressions à évaluer ou à exécuter pendant le débogage
JTech

49

Vous pouvez exécuter le code ci-dessous dans la fenêtre immédiate et il exportera vers un fichier xml la représentation XML sérialisée d'un objet:

(new System.Xml.Serialization.XmlSerializer(obj.GetType())).Serialize(new System.IO.StreamWriter(@"c:\temp\text.xml"), obj)

Source: Visual Studio comment sérialiser un objet à partir du débogueur


5
Cela devrait être voté pour que les gens puissent le trouver plus facilement. J'ai parcouru beaucoup de questions SO similaires avant de trouver cette excellente solution, qui m'a permis de vider une grande List <List <byte>> dans un fichier texte xml après le crash d'un programme de longue durée avec un problème de plantage rare. Juste un ajout: lorsque je l'ai exécuté pour la première fois, j'ai eu une erreur: "L'évaluation nécessite un thread pour s'exécuter temporairement. Utilisez la fenêtre Espion pour effectuer l'évaluation." Après avoir actualisé la fenêtre de surveillance, une deuxième tentative d'exécution de la commande a réussi.
Craig

Bat_Programmer: vous voudrez peut-être changer la première ligne de votre réponse, car cela suggère que ce qui sera produit est une liste d'objets, alors que ce qui est réellement produit est une représentation XML sérialisée d'un seul objet spécifié (variable).
Craig

Cannot evaluate expression because the code of the current method is optimized.???
Falco Alexander

Si vous avez json, vous pouvez faire ce qui suit:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression. J'utilise Visual Studio 2019; J'ai remplacé objpar le nom de la variable qui est typeSystem.Collections.Generic.List 1[[System.ValueTuple 3[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7]]
Drew le

27

1
Semble poser des problèmes pour une plus grande liste d'objets
Bat_Programmer

@Bat_Programmer Pour ne pas décourager en aucune façon d'utiliser le merveilleux outil d'Omar, veuillez noter que la fonction d'exportation OzCode a été affinée pour prendre en charge d'énormes listes d'objets. Essayez-le et faites-moi savoir si cela fonctionne bien pour vous.
Omer Raviv

20

Vous pouvez ajouter une montre pour cet objet, et dans la fenêtre de surveillance, développer et sélectionner tout ce que vous voulez copier, puis le copier.


1
Merci PMN qui m'a aidé aussi. En développant manuellement l'arborescence (ce serait bien s'il y avait un clic droit, développez tout) puis en le copiant dans le presse-papiers, je peux ensuite le coller et rechercher une valeur que je recherche au fond de l'arbre.
Kobus Smit

10

Réponse la plus populaire de https://stackoverflow.com/a/23362097/2680660 :

Avec un peu de chance, vous avez déjà Json.Net dans votre domaine d'application. Dans ce cas, insérez ceci dans votre fenêtre Exécution:

Newtonsoft.Json.JsonConvert.SerializeObject(someVariable)

4

En utilisant des attributs pour décorer vos classes et méthodes, vous pouvez avoir une valeur spécifique de l'affichage de votre objet pendant le débogage avec l' attribut DebuggerDisplay, par exemple

[DebuggerDisplay("Person - {Name} is {Age} years old")]
public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
}

Le fait est que je dois pouvoir copier tout le contenu de l'objet, et pas seulement certains d'entre eux. Oui, je pourrais créer un attribut DebbuggerDisplay assez complexe avec l'objet entier, mais toute modification de la classe nécessiterait également une modification de l'attribut.
Farinha

@Farinha Que voulez-vous faire de l'objet? Peut-être pourrait avoir une propriété qui est la version xml sérialisée de celui-ci.
Dave Anderson

1

Google m'a conduit à cette question vieille de 8 ans et j'ai fini par utiliser ObjectDumper pour réaliser quelque chose de très similaire au copier-coller des données du débogueur. C'était un jeu d'enfant.

Je connais la question posée spécifiquement sur les informations du débogueur , mais ObjectDumper donne des informations qui sont fondamentalement les mêmes. Je suppose que ceux qui recherchent sur Google cette question sont comme moi et ont juste besoin des données à des fins de débogage et ne se soucient pas de savoir si elles proviennent techniquement du débogueur ou non.


1

J'utilise toujours:

string myJsonString = JsonConvert.SerializeObject(<some object>);

Ensuite, je copie la valeur de la chaîne qui, malheureusement, copie également les barres obliques inverses.

Pour supprimer les backlashes, allez ici: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Ensuite, dans l' <p id="demo">Visit Microsoft!</p>élément, remplacez le texte par le texte que vous avez copié. puis remplacez la var res = str.replace("Microsoft", "W3Schools");ligne par

var res = str.replace(/\\/g, '')

Exécutez ces nouvelles modifications mais n'oubliez pas de cliquer sur le bouton «essayer» à droite.

Vous devriez maintenant avoir tout le texte de l'objet au format json que vous pouvez déposer dans un formateur json comme http://jsonformatter.org ou pour créer un POCO, vous pouvez maintenant utiliser http://json2csharp.com/


1

Je sais que je suis un peu en retard à la fête, mais j'ai écrit une implémentation JSON pour sérialiser un objet, si vous préférez avoir une sortie JSON. Utilise la référence Newtonsoft.Json.

private static void WriteDebugJSON (dynamic obj, string filePath)
{
    using (StreamWriter d = new StreamWriter(filePath))
    {
        d.Write(JsonConvert.SerializeObject(obj));
    }
}

0

si vous avez une liste et que vous voulez trouver une variable spécifique: Dans la fenêtre immédiate, tapez

 myList.Any(s => s.ID == 5062);

si cela retourne vrai

var myDebugVar = myList.FirstOrDefault(s => s.ID == 5062);
?myDebugVar

0

J'ai juste cliqué avec le bouton droit de la souris sur la variable et sélectionné AddWatch , cela fait apparaître la fenêtre de surveillance qui comprend toutes les valeurs. J'ai tout sélectionné et je l'ai collé dans un texte dans un éditeur de texte, c'est tout.


1
le problème est de copier l'objet de cette façon, vous devez développer nœud par nœud et j'ai 145 nœuds
derloopkat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.