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#?
risposta
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.
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. –
No, C# viene convertito in codice macchina, IL è solo un passaggio intermedio. Usa Debug> Windows> Disassembly per vederlo. Funzionalità, non un bug. –
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.
Come fa il debugger per variabili arbitrarie? Non c'è una libreria di debug che potrebbe aiutarmi a raggiungere lo stesso livello di tracciamento? – luvieere
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.
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
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.
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
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.
- 1. Utilizzo di una stringa come variabile in fase di esecuzione
- 2. Posso inserire una colonna in listview in fase di esecuzione?
- 3. Rileva modifica della variabile in fase di esecuzione in C/C++
- 4. scegliere una monade in fase di esecuzione
- 5. Come definire un oggetto C# in fase di esecuzione?
- 6. Caricamento di DLL in fase di esecuzione in C#
- 7. Selezionare argomento template in fase di esecuzione in C++
- 8. Impostazione tipo generico in fase di esecuzione
- 9. Posso espandere una stringa che contiene C# espressioni letterali in fase di esecuzione
- 10. Come posso creare una proprietà di classe statica PHP in fase di esecuzione (in modo dinamico)?
- 11. Posso distinguere tra istanze di typeclass in fase di esecuzione?
- 12. Impostazione del valore enum in fase di esecuzione in C#
- 13. C# Crea e modifica classe in fase di esecuzione
- 14. Rimozione di una funzione in fase di esecuzione in PHP
- 15. Come posso disabilitare Crashlytics in fase di esecuzione in risposta a una modifica delle preferenze dell'utente?
- 16. C++ dimensione di memoria dinamica in fase di esecuzione
- 17. Modifica del valore di una macro in fase di esecuzione
- 18. C++ Assegnare un valore const in fase di esecuzione?
- 19. Modifica implementazione/classe in fase di esecuzione
- 20. E 'possibile dichiarare una variabile in C, il cui nome è dato dall'utente in fase di esecuzione?
- 21. Voglio ottenere il tipo di una variabile in fase di esecuzione
- 22. Fortran - tipo di impostazione/precisione di una variabile in fase di esecuzione
- 23. Modifica proprietà log4j in fase di esecuzione
- 24. Creazione di una variabile di conteggio in esecuzione in R?
- 25. Come faccio a sbarazzarmi di LD_LIBRARY_PATH in fase di esecuzione?
- 26. è possibile assegnare una funzione a una variabile di classe in fase di runtime in php?
- 27. Come fare riferimento all'assemblaggio in mvc in fase di esecuzione
- 28. C: informazioni del compilatore in fase di esecuzione
- 29. È possibile guardare le variabili in fase di esecuzione?
- 30. Come cambiare lingua in fase di esecuzione in java swing
Perché il debugger non è un'opzione? Questo è esattamente ciò che è per. –
@ 0xA3 Perché ho bisogno di accedere a quei valori dalla mia applicazione, in fase di esecuzione, solo quando cambiano. – luvieere
Come scrivere i valori delle modifiche della variabile in un file di registro semplice. – Shivam