2011-11-14 17 views
21

Sto pensando di aggiungere una build in modalità diagnostica in un'app che sto scrivendo per contare l'utilizzo del metodo e il tempo di esecuzione, simile a quello che fanno molti profiler del codice come dotTrace.Come funzionano i profiler .NET?

Ho difficoltà a trovare risorse tramite google su come ottenere questo risultato; ovviamente è possibile, ma qualcuno può indicarmi alcune risorse su come posso implementare qualcosa come il conteggio delle chiamate di metodo in .NET?

+8

http://www.codeproject.com/KB/dotnet/dotnetprofiler.aspx – Oded

+0

per ottenere che si dovrà andare abbastanza basso livello e persino utilizzare C++ (nativo) dal momento che sarà necessario collegare il .NET runtime stesso (vedi il link di Oded per esempio) ... un'altra opzione è quella di utilizzare alcuni prodotti (ad esempio SmartAssembly può essere configurato per creare rapporti di utilizzo nell'app) per quel genere di cose ... – Yahia

+0

Credo che loro fondamentalmente disassemblare il codice in IL, quindi iniettare vari marcatori dopo ogni istruzione .. Sicuramente non banale da scrivere, ma suppongo che sia per questo che la roba ANTS è così costosa. –

risposta

7

L'articolo del progetto di codice Creating a Custom .NET Profiler descrive il processo di creazione di un profiler utilizzando i ganci del profiler CLR.

Questo comporta la creazione di un oggetto COM che implementa l'interfaccia ICorProfilerCallback2 e quindi utilizzando le variabili di ambiente per indicare al CLR che vogliamo profilo utilizzando questa classe:

Quando il CLR inizia un processo, sembra per due variabili d'ambiente:

  • COR_ENABLE_PROFILING: Questa variabile di ambiente è impostata su 1 o 0. 1 indica che il CLR deve utilizzare un profiler. 0 (o la non esistenza di questa variabile d'ambiente) indica che non dovrebbe usare un profiler.
  • COR_PROFILER: Ora che abbiamo detto al CLR che vogliamo fare il profilo, dobbiamo dire quale profiler usare. Poiché i profiler sono implementati come oggetti COM, questa variabile di ambiente verrà impostata sul GUID della coclasse che implementa l'interfaccia ICorProfilerCallback2.
+0

È possibile impostare 2 profiler simultaneamente? come impostare la variabile env COR_PROFILER al fine di utilizzare due DLL di profilatore contemporaneamente. – Kira

+0

Ne dubito. In particolare come la descrizione parla di un singolo profiler. Suppongo che potresti creare un proxy profiler che altri profiler potrebbero sottoscrivere, ma è solo un'idea. – Oded

1

Forse sono qui troppo semplice, ma la mia soluzione sarebbe la registrazione. Utilizzando entlib o log4net e registra i messaggi di livello di debug. Quindi puoi semplicemente scrivere un piccolo script/programma per analizzare il file di registro e darti il ​​conteggio del metodo. Potrebbero esserci anche altri strumenti di diagnostica del registro.

A meno che non sia necessaria la visualizzazione avanzata o la mappatura delle relazioni complesse in tempo reale ecc. Sarebbe necessario un profiler? Per il conteggio dei metodi e il tempo di esecuzione, non sarebbe sufficiente un file di registro? Una volta che sei in produzione o non ti interessa la strumentazione, accendi il livello di registrazione e dimenticati di questi messaggi di debug.

+1

Il problema con la registrazione è dover sporcare il mio codice con le chiamate di registrazione. Soprattutto se voglio fare qualcosa come il tempo di esecuzione ho bisogno di aggiungere 3+ linee per ogni metodo (impostazione timer/avvio, arresto del timer, chiamata dei messaggi di registro) al minimo. Questo è abbastanza disordinato. – Amasuriel

+0

concordato. Ecco perché vorrei suggerire un framework AOP come Spring.Net o PostSharp. AOP è meraviglioso a sé stante, non solo per la registrazione. Certo, non aggiungerei un componente completamente nuovo a un progetto solo per strumentare un metodo o salvare 3 righe di codice in un unico posto, ma se lo si utilizza regolarmente, quindi AOP di distanza. Il ROI per AOP è piuttosto alto e il punto di non ritorno a cui dovrebbero essere introdotti è piuttosto basso, in altre parole qualsiasi progetto che sia anche lievemente complesso/professionale. In effetti, se stai pensando al logging, dovresti davvero pensare anche ad AOP. I miei 2 centesimi :-) – Chaitanya

+0

Non ero a conoscenza di PostSharp, grazie per il link. Stavo pianificando di utilizzare la libreria aziendale 5 per la registrazione, ma stavo già facendo il cruccio al numero di chiamate al metodo che ingombrano il mio codice. – Amasuriel