Kopieren Sie Objektwerte im Visual Studio-Debugmodus


138

Im Visual Studio-Debug-Modus können Sie mit der Maus über Variablen fahren, um deren Wert anzuzeigen, und dann mit der rechten Maustaste auf "Kopieren", "Ausdruck kopieren" oder "Wert kopieren" klicken.

Falls die Variable ein Objekt und nicht nur ein Basistyp ist, gibt es ein + -Zeichen, um das Objekt zu erweitern und zu untersuchen. Gibt es eine Möglichkeit, all das in die Zwischenablage zu kopieren?

Antworten:


190

Geben Sie im unmittelbaren Fenster ein

?name_of_variable

Dadurch wird alles ausgedruckt , und Sie können es manuell kopieren, wo immer Sie möchten, oder die Protokollierungsfunktionen des unmittelbaren Fensters verwenden, um es automatisch in eine Datei zu schreiben.

UPDATE : Ich nehme an, Sie haben gefragt, wie die verschachtelte Struktur der Werte kopiert / eingefügt werden soll, damit Sie sie entweder textuell durchsuchen oder auf der Seite speichern und später den Status des Objekts damit vergleichen können. Wenn ich recht habe, sollten Sie sich die von mir erstellte kommerzielle Erweiterung von Visual Studio mit dem Namen OzCode ansehen , mit der Sie diese Aufgaben viel einfacher über die Funktionen "Suchen" und "Vergleichen" ausführen können.

UPDATE 2 Um die Frage von @ ppumkin zu beantworten, oder das neue EAP verfügt über eine neue Exportfunktion, mit der Benutzer die Variablenwerte in Json-, XML-, Excel- oder C # -Code exportieren können.

Vollständige Offenlegung: Ich bin Mitentwickler des hier beschriebenen Tools.


5
Wäre noch besser gewesen, wenn es rekursiv erweitert werden könnte, um alles zu zeigen. Es könnte viel Text sein, aber ich würde dann möglicherweise nach einem Wert suchen, der tiefer im Baum liegt.
Kobus Smit

3
PS Ich liebe die Funktionen von Bugaid so sehr. Wenn ich den Trail jetzt herunterlade und wenn er abläuft und ich anfange, meine Augäpfel zu messen, wird mein Chef ihn für mich kaufen. :)
Piotr Kula

16
Weiß jemand, wie man mehr als 100 Artikel ausgibt? Ich erhalte dies, nachdem die ersten 100 im Sofortfenster angezeigt wurden: <Mehr ... (Die ersten 100 von 335 Elementen wurden angezeigt.)>
Lachs

6
Was genau ist mit "dem unmittelbaren Fenster" gemeint?
alex

3
@alex: Gehen Sie in Visual Studio zu Debug> Windows> Sofort - Hier können Sie Ausdrücke eingeben, die während des Debuggens ausgewertet oder ausgeführt werden sollen
JTech

48

Sie können den folgenden Code im unmittelbaren Fenster ausführen und die serialisierte XML-Darstellung eines Objekts in eine XML-Datei exportieren:

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

Quelle: Visual Studio zum Serialisieren von Objekten aus dem Debugger


5
Dies sollte positiv bewertet werden, damit die Leute es leichter finden können. Ich habe viele ähnliche SO-Fragen durchgearbeitet, bevor ich diese großartige Lösung gefunden habe, die es mir ermöglichte, nach dem Absturz eines lang laufenden Programms mit einem seltenen Absturzproblem eine große Liste <Liste <Byte>> in eine XML-Textdatei zu kopieren. Nur eine Ergänzung: Als ich es zum ersten Mal ausführte, wurde folgende Fehlermeldung angezeigt: "Für die Evaluierung muss ein Thread vorübergehend ausgeführt werden. Verwenden Sie das Überwachungsfenster, um die Evaluierung durchzuführen." Nach dem Aktualisieren des Überwachungsfensters war ein zweiter Versuch, den Befehl auszuführen, erfolgreich.
Craig.Feied

Bat_Programmer: Möglicherweise möchten Sie die erste Zeile Ihrer Antwort ändern, da dies darauf hindeutet, dass eine Liste von Objekten ausgegeben wird, während tatsächlich eine serialisierte XML-Darstellung eines einzelnen angegebenen Objekts (einer Variablen) ausgegeben wird.
Craig.Feied

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

Wenn Sie json haben, können Sie Folgendes tun:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression. Ich verwende Visual Studio 2019; Ich habe objdurch den Variablennamen TypSystem.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

27

1
Scheint Probleme für größere Liste von Objekten zu geben
Bat_Programmer

@Bat_Programmer Um die Verwendung von Omars wunderbarem Tool in keiner Weise zu verhindern, beachten Sie bitte, dass die OzCode-Exportfunktion so optimiert wurde, dass sie große Listen von Objekten unterstützt. Bitte versuchen Sie es und lassen Sie mich wissen, ob es für Sie gut funktioniert.
Omer Raviv

20

Sie können eine Überwachung für dieses Objekt hinzufügen und im Überwachungsfenster alles erweitern und auswählen, was Sie kopieren möchten, und es dann kopieren.


1
Danke PMN, das hat mir auch geholfen. Durch manuelles Erweitern des Baums (wäre schön, wenn es einen Rechtsklick gäbe, alle erweitern) und anschließendes Kopieren in die Zwischenablage kann ich ihn dann einfügen und nach einem Wert suchen, den ich tief im Baum sehe.
Kobus Smit


4

Durch die Verwendung von Attributen zum Dekorieren Ihrer Klassen und Methoden können Sie während des Debuggens mit dem DebuggerDisplay-Attribut einen bestimmten Wert aus Ihrer Objektanzeige erhalten , z

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

Die Sache ist, ich muss in der Lage sein, alle Objektinhalte und nicht nur einige davon zu kopieren. Ja, ich könnte ein ausreichend komplexes DebbuggerDisplay-Attribut mit dem gesamten Objekt erstellen, aber alle Änderungen an der Klasse würden auch eine Änderung des Attributs erfordern.
Farinha

@Farinha Was möchtest du mit dem Objekt machen? Vielleicht könnte eine Eigenschaft haben, die die serialisierte XML-Version davon ist.
Dave Anderson

1

Google hat mich zu dieser 8 Jahre alten Frage geführt und ich habe schließlich ObjectDumper verwendet , um etwas zu erreichen, das dem Einfügen von Debuggerdaten sehr ähnlich ist. Es war ein Kinderspiel.

Ich kenne die Frage, die speziell zu Informationen aus dem Debugger gestellt wurde , aber ObjectDumper liefert Informationen, die im Grunde gleich sind. Ich gehe davon aus, dass diejenigen, die diese Frage googeln, wie ich sind und die Daten nur zum Debuggen benötigen und sich nicht darum kümmern, ob sie technisch vom Debugger stammen oder nicht.


1

Ich benutze immer:

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

Dann kopiere ich den Stringwert, der leider auch die Schrägstriche kopiert.

Um die Spielräume zu entfernen, klicken Sie hier: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

<p id="demo">Visit Microsoft!</p>Ersetzen Sie dann innerhalb des Elements den Text durch den Text, den Sie kopiert haben. Ersetzen Sie dann die var res = str.replace("Microsoft", "W3Schools");Leitung durch

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

Führen Sie diese neuen Änderungen aus, aber vergessen Sie nicht, rechts auf die Schaltfläche "Probieren Sie es aus" zu klicken.

Jetzt sollten Sie den gesamten Text des Objekts im JSON-Format haben, den Sie in einem JSON-Formatierer wie http://jsonformatter.org ablegen können. Um einen POCO zu erstellen, können Sie jetzt http://json2csharp.com/ verwenden.


1

Ich weiß, dass ich etwas spät zur Party komme, aber ich habe eine JSON-Implementierung zum Serialisieren eines Objekts geschrieben, wenn Sie eine JSON-Ausgabe bevorzugen. Verwendet die Newtonsoft.Json-Referenz.

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

0

Wenn Sie eine Liste haben und eine bestimmte Variable suchen möchten: Geben Sie im unmittelbaren Fenster ein

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

wenn dies true zurückgibt

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

0

Ich habe gerade mit der rechten Maustaste auf die Variable geklickt und AddWatch ausgewählt. Daraufhin wird das Überwachungsfenster angezeigt , das aus allen Werten besteht. Ich habe alle ausgewählt und in einen Text einen Texteditor eingefügt, das ist alles.


1
Das Problem ist, das Objekt so zu kopieren, dass Sie Knoten für Knoten erweitern müssen, und ich habe 145 Knoten
derloopkat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.