Copia i valori degli oggetti in modalità debug di Visual Studio


138

Nella modalità di debug di Visual Studio è possibile passare il mouse sopra le variabili per mostrare il loro valore e quindi fare clic con il tasto destro del mouse su "Copia", "Copia espressione" o "Copia valore".

Nel caso in cui la variabile sia un oggetto e non solo un tipo base, c'è un segno + per espandere ed esplorare l'oggetto. C'è un modo per copiare tutto ciò negli appunti?

Risposte:


192

Nella finestra immediata, digitare

?name_of_variable

Questo stamperà tutto e potrai copiarlo manualmente dove vuoi, oppure utilizzare le funzionalità di registrazione della finestra immediata per scriverlo automaticamente in un file.

AGGIORNAMENTO : suppongo che ti stia chiedendo come copiare / incollare la struttura nidificata dei valori in modo da poterlo cercare testualmente o in modo da poterlo salvare sul lato e poi confrontare lo stato dell'oggetto con esso. Se ho ragione, potresti voler controllare l'estensione commerciale di Visual Studio che ho creato, chiamato OzCode , che ti consente di fare queste cose molto più facilmente attraverso le funzionalità "Cerca" e "Confronta".

AGGIORNAMENTO 2 Per rispondere alla domanda di @ ppumkin, o il nuovo EAP ha una nuova funzione di esportazione che consente agli utenti di esportare i valori delle variabili in codice Json, XML, Excel o C #.

Divulgazione completa: sono il co-creatore dello strumento che ho descritto qui.


5
Sarebbe stato ancora meglio se si fosse espanso ricorsivamente per mostrare tutto. Potrebbe essere un sacco di testo, ma sarei quindi possibile cercarlo per un valore più profondo nella struttura.
Kobus Smit,

3
PS: adoro le caratteristiche di Bugaid. scaricando il percorso ora e quando scade e comincio a misurare i miei occhi, il mio capo lo comprerà per me .. :)
Piotr Kula,

16
Qualcuno sa come produrre più di 100 articoli? Ottengo questo dopo che i primi 100 sono stati visualizzati nella finestra immediata: <Altro ... (Sono stati visualizzati i primi 100 di 335 articoli.)>
lachs

6
Cosa si intende esattamente per "finestra immediata"?
alex,

3
@alex: in Visual Studio, vai su Debug> Windows> Immediatamente - Ti consente di inserire espressioni da valutare o eseguire durante il debug
JTech

49

È possibile eseguire il codice sottostante nella finestra immediata ed esporterà in un file XML la rappresentazione XML serializzata di un oggetto:

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

Fonte: Visual Studio come serializzare l'oggetto dal debugger


5
Questo dovrebbe essere votato in modo che le persone possano trovarlo più facilmente. Ho risolto molte simili domande SO prima di trovare questa ottima soluzione, che mi ha permesso di scaricare un grande Elenco <Elenco <byte>> in un file di testo XML dopo l'incidente di un programma di lunga durata con un raro problema di arresto. Solo un'aggiunta: quando l'ho eseguito per la prima volta ho ricevuto un errore: "La valutazione richiede l'esecuzione temporanea di un thread. Utilizzare la finestra di controllo per eseguire la valutazione". Dopo aver aggiornato la finestra di controllo, un secondo tentativo di eseguire il comando ha avuto esito positivo.
Craig

Bat_Programmer: potresti voler cambiare la prima riga della tua risposta, perché suggerisce che ciò che verrà prodotto è un elenco di oggetti, mentre ciò che viene realmente prodotto è una rappresentazione XML serializzata di un singolo oggetto specificato (variabile).
Craig

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

Se hai json, puoi fare quanto segue:File.WriteAllText(@"c:\movie.json", JsonConvert.SerializeObject(movie));
user890332

The debugger is unable to evaluate this expression. Sto usando Visual Studio 2019; Ho sostituito objcon il nome della variabile che è di tipoSystem.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
Sembra dare problemi per un elenco più ampio di oggetti
Bat_Programmer

@Bat_Programmer Per non scoraggiare in alcun modo l'uso del meraviglioso strumento di Omar, si noti che la funzione di esportazione di OzCode è stata perfezionata per supportare enormi elenchi di oggetti. Per favore provalo e fammi sapere se funziona bene per te.
Omer Raviv,

20

È possibile aggiungere un orologio per quell'oggetto e nella finestra dell'orologio espandere e selezionare tutto ciò che si desidera copiare, quindi copiarlo.


1
Grazie PMN che mi ha aiutato anche. Espandendo manualmente l'albero (sarebbe bello se ci fosse un clic destro, espandi tutto) e quindi copiandolo negli appunti, posso quindi incollarlo e cercare un valore che sto guardando in profondità nell'albero.
Kobus Smit,


4

Utilizzando gli attributi per decorare le classi e i metodi, è possibile avere un valore specifico dalla visualizzazione dell'oggetto durante il debug con l' attributo DebuggerDisplay, ad es.

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

Il fatto è che devo essere in grado di copiare tutto il contenuto dell'oggetto, e non solo alcuni di essi. Sì, potrei creare un attributo DebbuggerDisplay abbastanza complesso con l'intero oggetto, ma qualsiasi modifica alla classe avrebbe bisogno di essere modificata anche nell'attributo.
Farinha,

@Farinha Cosa vuoi fare con l'oggetto? Forse potrebbe avere una proprietà che è la versione xml serializzata di esso.
Dave Anderson,

1

Google mi ha portato a questa domanda di 8 anni e ho finito per usare ObjectDumper per ottenere qualcosa di molto simile ai dati del debugger copia-incolla. E 'stato un gioco da ragazzi.

Conosco la domanda posta specificamente sulle informazioni dal debugger , ma ObjectDumper fornisce informazioni sostanzialmente uguali. Suppongo che coloro che cercano questa domanda su Google siano come me e abbiano solo bisogno dei dati per scopi di debug e non si preoccupino se provengono tecnicamente dal debugger o meno.


1

Uso sempre:

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

Quindi copio il valore della stringa che sfortunatamente copia anche le barre rovesciate.

Per rimuovere i contraccolpi, vai qui: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_replace

Quindi all'interno <p id="demo">Visit Microsoft!</p>dell'elemento sostituisci il testo con il testo che hai copiato. quindi sostituire la var res = str.replace("Microsoft", "W3Schools");linea con

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

Esegui queste nuove modifiche ma non dimenticare di fare clic sul pulsante "provalo" sulla destra.

Ora dovresti avere tutto il testo dell'oggetto in formato json che puoi inserire in un formattatore json come http://jsonformatter.org o per creare un POCO ora puoi usare http://json2csharp.com/


1

So di essere un po 'in ritardo alla festa, ma ho scritto un'implementazione JSON per serializzare un oggetto, se preferisci avere un output JSON. Utilizza il riferimento Newtonsoft.Json.

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

0

se hai un elenco e vuoi trovare una variabile specifica: Nella finestra immediata, digita

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

se questo ritorna vero

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

0

Ho appena fatto clic con il tasto destro sulla variabile e selezionato AddWatch , che fa apparire la finestra di controllo che comprende tutti i valori. Ho selezionato tutto e incollato in un testo un editor di testo, tutto qui.


1
il problema è copiare l'oggetto nel modo in cui è necessario espandere nodo per nodo e ho 145 nodi
derloopkat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.