2009-10-12 6 views
20

Esistono librerie interne o di terze parti che consentono di scaricare semplicemente tutte le variabili in memoria durante il runtime? Quello che vorrei è poter visualizzare le variabili & valori correnti in modo simile a visualizzarli, colpendo un punto di interruzione e passando con il mouse sopra le variabili, ma senza dover effettivamente interrompere l'esecuzione del programma (ad esempio, ottenere uno snapshot). Sarebbe bello se potesse scaricarli in un file che può essere aperto successivamente in un programma per avere una bella interfaccia grafica per vederli, ma un semplice dump di file di testo sarebbe abbastanza buono.C# Come scaricare tutte le variabili e i valori correnti durante il runtime

+0

Penso che questa domanda sia molto generica e che faccia parte di un "super-debugger" se esistesse una risposta, quindi ho aperto una taglia per questo. Immagina se la lista delle variabili fosse filtrabile al volo e fornisse anche l'uso della memoria (si può sognare). –

+0

"self-debugger"? –

+1

No, intendevo "super" perché sarebbe superiore a quello che attualmente abbiamo con C#. –

risposta

7

Non riesco a pensare a un modo semplice per farlo in modo generico. Ciò che potrebbe funzionare è la creazione di un file di dump del processo in esecuzione a livello di programmazione. È possibile farlo con P/Invoke alle routine dbghelp.dll o generare un processo cdb.exe per creare il file di dettagli. Una volta ottenuto il file, è possibile aprirlo in un debugger per un'analisi successiva utilizzando SOS.dll with cdb.exe/windbg.exe oppure scrivere uno debugger script per eseguire il dump dei dati desiderati (principalmente) automaticamente.

4

credo una sorta di quadro di registrazione vi aiutano a farlo ...

Partenza:

http://www.dotnetlogging.com/

Al mio posto di lavoro usiamo log4net che funziona abbastanza bene per noi.

Allora, come mai stai cercando di scaricare tutte le variabili per un'analisi successiva? Hai preso in considerazione la possibilità di scrivere prima il test del codice in modo da poter ridurre la dipendenza dal debugger e disporre di una suite di test automatici che controllano i valori per te?

+0

Sì, uso già la registrazione simile a log4net. Tuttavia volevo di più un dump di variabile generico in modo che non avrei dovuto scrivere codice specifico per eseguire il dump di variabili su un programma di registrazione per ogni programma. Sarebbe anche bello avere un visualizzatore GUI di un'istantanea in modo che per le strutture di classi complesse sia facile da leggere. – mike

+0

Voglio scaricare le variabili per la massima tranquillità. Sono fiducioso nel programma ma voglio solo confermare che tutto sta andando bene. È estremamente difficile scrivere test approfonditi sulla natura del lavoro che sto facendo, e anche in questo caso puoi solo scrivere test per situazioni a cui puoi pensare. Sarebbe anche in grado di formarsi come un modo di livello basso per vedere in quale stato si trova il programma in qualsiasi momento. – mike

1

In passato ho utilizzato il profiler YourKit .Net per profilare le applicazioni .Net.

Anche se l'ho usato solo per connettersi alle applicazioni in esecuzione personalmente, lo Snapshot documentation afferma di disporre di uno Profiler API che può essere utilizzato per scaricare le istantanee a livello di codice per una revisione successiva.

Codice saggia questo sembra essere semplice come il seguente:

Controller c = new Controller(); 
String snapshotPath = c.CaptureSnapshot(); 

io credo che si possa caricare i file di snapshot nella GUI YourKit in un secondo momento per rivederli.

Non sarei sorpreso se alcuni degli altri profiler popolari come JetBrains dotTrace Performance e Redgates ANTS Performance Profiler hanno API programmatiche simili, ma non riuscivo a trovare rapidamente la documentazione evidenti sui loro siti web (e non ho voglia di guardare i loro webinar per scopri se questa funzionalità esistesse!)

+1

Dovresti forse dire che YourKit costa. WMemoryProfiler è gratuito e open source. Ho anche trovato nelle pagine web dei profiler commerciali, ad eccezione di Yourkit, nessuna snapshot di memoria programmatica Api. Gli altri hanno solo Apis per le istantanee del profiler delle prestazioni. Se questa caratteristica esistesse, sono sicuro che il marketing l'avrebbe messo sulla loro pagina web. –

0

Puoi provare lo strumento Intellitrace fornito con la versione definitiva di Visual Studio. È ciò che descrivi: registra ciò che accade nella tua app e ti consente di eseguire il debug senza eseguire il programma con il passaggio del mouse sulle variabili e tutte le altre finestre di debug per aiutarti.

0

È possibile utilizzare PostSharp. Ho trovato molto utile registrare i tempi di debug a causa dell'applicazione dell'ambiente. E ha strumentato/registrato molte cose.

Ma ovviamente è necessario specificare tutte le variabili che è necessario registrare.

Verificare ulteriori dettagli here.

1

Per questo si può utilizzare WMemoryProfiler per

  • Prendi tutti gli oggetti di tutti i AppDomain come una matrice di oggetti
  • Creare un dump della memoria del proprio processo
  • oggetti specifici serializzare disco

Per far sì che ciò accada, è necessario Windbg, ma l'API di WMemoryProfiler è completamente gestita e in pratica è possibile eseguire il debug del proprio processo. La libreria si occupa delle solite stranezze del debugger poiché avvolge Windbg in una bella libreria accessibile.

Il seguente codice fa arrivare tutte le istanze di oggetti System.Threading.Thread in un array oggetto. In questo modo è possibile scrivere un visualizzatore per i propri oggetti dell'applicazione in fase di runtime. L'altro sovraccarico ti dà semplicemente tutti gli oggetti in tutti gli AppDomain.

using (var debugger = new MdbEng()) 
{ 
    var dummy = new Thread(() => {}); 
    dummy.Name = "Dummy Thread"; 

    // Get all thread objects in all AppDomains 
    var threads = debugger.GetObjects("System.Threading.Thread", true); 

    foreach (Thread t in threads) 
    { 
    Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name); 
    } 
    GC.KeepAlive(dummy); 
} 

Poiché si tratta di un wrapper Windbg è anche possibile creare un dump di memoria al volo e poi caricare un dump di memoria dal processo per estrarre i dati degli oggetti per la visualizzazione dalla discarica. I profiler della memoria commerciale (ad esempio MemoryProfiler di Scitech) impiegano questa tecnica da anni ma è piuttosto lento quando si dispone di un enorme dump della memoria poiché utilizzano anche Windbg come analizzatore di dumping.

Problemi correlati