2010-05-26 7 views
5

Come posso tenere traccia dei valori di una variabile mentre cambiano, in fase di esecuzione, in C#? Mi interessa la stessa funzionalità che il debugger fornisce quando sto tracciando una variabile attraverso i passaggi di esecuzione, solo che ho bisogno di richiamarlo dal mio codice. Una sorta di osservazione dei valori-chiave, ma per tutti i tipi di variabili (locali, di classe, statici, ecc.), Non solo proprietà. Quindi, in sostanza, ricevi una notifica quando il valore di una variabile cambia.Come posso tracciare una variabile in fase di esecuzione in C#?

+0

Perché il debugger non è un'opzione? Questo è esattamente ciò che è per. –

+0

@ 0xA3 Perché ho bisogno di accedere a quei valori dalla mia applicazione, in fase di esecuzione, solo quando cambiano. – luvieere

+0

Come scrivere i valori delle modifiche della variabile in un file di registro semplice. – Shivam

risposta

3

Si sta lavorando partendo dal presupposto che il debugger possa tenere traccia delle variazioni delle variabili. Non può

È possibile con codice non gestito, il processore ha registri di debug dedicati che consentono di impostare i breakpoint dei dati. Sono forniti fino a tre. Genera un interrupt hardware quando vede una particolare posizione di memoria scritta. Questa caratteristica altrimenti molto utile non è tuttavia disponibile nel codice gestito. Il garbage collector è completamente incompatibile con esso, sposta gli oggetti intorno, dando loro un altro indirizzo.

Il debugger gestito supporta una condizione di "quando viene colpito" su un punto di interruzione, consentendo di scaricare informazioni nella finestra di output. Tuttavia, ciò richiede un punto di interruzione, non può essere attivato da un cambiamento nel valore della variabile. Anche in realtà rallenta l'esecuzione del codice poiché il debugger entra effettivamente in uno stato di interruzione prima dell'esecuzione della condizione.

Il posto ovvio per mettere un tale punto di rottura è in un setter di proprietà. Qual è ciò di cui avrai bisogno per implementare questa funzione nel codice. Puoi fare tutto ciò che vuoi in quel setter, usando la classe Trace per esempio.

+0

for¹ per la risposta, tuttavia sono un po 'in disaccordo con il punto di un grande rallentamento di un semplice breakpoint condizionale. Poiché C# viene convertito in un bytecode, il modo più appropriato per un debugger è semplicemente creare e inserire un bytecode che stampi un valore nella posizione del valore. Non vedo una ragione per cui non potrebbe essere fatto in questo modo - e quindi un'altra implementazione di un punto di interruzione del debugger chiamerei un bug delle prestazioni. –

+2

No, C# viene convertito in codice macchina, IL è solo un passaggio intermedio. Usa Debug> Windows> Disassembly per vederlo. Funzionalità, non un bug. –

0

L'unico modo sensato che si possa fare che senza il debugger sarebbe: non utilizzare una variabile, ma utilizzare una proprietà, e (forse condizionalmente) aggiungere traccia per il setter:

private int myValue; 
public int MyValue { 
    get {return myValue;} 
    set { 
     SomeTraceMethod(myValue, value, ...); 
     myValue = value; 
    } 
} 

Ovviamente questo non può quindi essere utilizzato per campi arbitrari campi/variabili.

+0

Come fa il debugger per variabili arbitrarie? Non c'è una libreria di debug che potrebbe aiutarmi a raggiungere lo stesso livello di tracciamento? – luvieere

3

Per aggiungere a ciò che Marc ha detto, se si desidera eseguire questa operazione per un sacco di proprietà e metodi, è possibile controllare tecniche di programmazione orientate all'aspetto e librerie come PostSharp.

http://www.sharpcrafters.com/postsharp

0

Come altri menzionato un meccanismo analogo a quello senso solo quando si usano le proprietà. In .NET è quindi possibile utilizzare l'interfaccia INotifyPropertyChanged.

Per un campione come implementarlo vedere

How to: Implement the INotifyPropertyChanged Interface

I colloqui articolo fa riferimento in modo esplicito su Windows Form, ma non sono tenuti a che (l'interfaccia è in realtà dichiarato in lo spazio dei nomi System.ComponentModel in System.dll). In effetti, questa interfaccia è ampiamente utilizzata per gli scenari di associazione dei dati, ad es. in WPF.

+0

Ho menzionato nella domanda che mi interessano le variabili arbitrarie, non le proprietà. Conosco INotifyPropertyChanged, quello che non so è come tracciare variabili arbitrarie, come fa il debugger. – luvieere

1

Il debugger gestito utilizza l'API COM ICorDebug per praticamente tutto. La parte che ti interessa è ICorDebugValue e i suoi discendenti. Si noti che una MOLTA dell'API di debug richiede che il processo non sia in esecuzione (cioè, si sia verificato un punto di interruzione) per consentire l'esecuzione delle varie ispezioni.Una panoramica di alto livello di ICorDebug è here. La documentazione su di esso è piuttosto scarsa, ma alcuni googling possono aiutare. In bocca al lupo.

Problemi correlati