Domanda

Recentemente ho iniziato a utilizzare gli strumenti di profilazione ANTS per il lavoro di produzione.Oltre ad essere stupito dalla loro bellezza, non ho potuto fare a meno di chiedermi come funzionano.Ad esempio, una delle funzionalità più utili consente di visualizzare le radici globali di un programma in esecuzione complete del numero di riferimenti a valori di diverso tipo.

Come fa questo strumento a ottenere tali informazioni?

È stato utile?

Soluzione

(Informativa completa:Faccio parte del team di Visual Studio Profiler, ma le informazioni seguenti sono pubbliche)

Puoi farlo scrivendo un profiler CLR che viene eseguito all'interno del processo che stai prendendo di mira.I profiler CLR sono oggetti COM C++ di cui viene creata un'istanza dal runtime quando COR_PROFILER E COR_PROFILING_ENABLED vengono impostate le variabili di ambiente (vedi Qui).Ce ne sono due principali Interfacce di profilazione CLR, nello specifico, ICorProfilerCallback E ICorProfilerInfo. ICorProfilerCallback è ciò che CLR utilizza per avvisarti di eventi specifici a cui ti iscrivi (caricamenti di moduli, conformità JIT di funzioni, creazione di thread, eventi GC), mentre ICorProfilerInfo può essere utilizzato dal profiler per ottenere informazioni aggiuntive su thread, moduli, tipi, metodi e metadati per gli assembly caricati.Questa interfaccia è ciò che tu Potevo utilizzare per ottenere informazioni sui simboli sui tipi allocati.

Con il profiler in corso, puoi forzare il passaggio di un GC ICorProfilerInfo::ForceGC.Una volta completato il GC, il tuo profiler riceverà una notifica tramite ICorProfilerCallback2::GarbageCollectionFinished, e otterrai i riferimenti root tramite ICorProfilerCallback2::RootReferences2.Quando combini le informazioni di riferimento della radice con ICorProfilerCallback::ObjectReferences, puoi ottenere il grafico di riferimento dell'oggetto completo per la tua applicazione .NET.

Puoi ottenere maggiori informazioni in tempo reale utilizzando il file ICorProfilerCallback::ObjectAllocated callback per determinare quando vengono creati i singoli oggetti CLR.Questo può essere costoso, tuttavia, poiché stai sostenendo almeno una chiamata di funzione aggiuntiva per ciascun oggetto allocato.È possibile tenere traccia di singoli oggetti mappando i file assegnati da CLR ObjectID al tuo ID interno.UN ObjectID per un dato oggetto è un puntatore effimero poiché può cambiare man mano che si verificano le raccolte dei rifiuti, il che può causare lo spostamento degli oggetti durante la compattazione.Questo processo è illustrato Qui.È possibile utilizzare le informazioni da ICorProfilerCallback::MovedReferences per tenere traccia degli oggetti in movimento.

Per attivare i callback sopra menzionati, devi comunicare all'API di profilazione CLR che ti interessano.Puoi farlo specificando COR_PRF_MONITOR_GC E COR_PRF_MONITOR_OBJECT_ALLOCATED come parte dei flag di evento durante la chiamata ICorProfilingInfo::SetEventMask.

David Broman è lo sviluppatore del profiler CLR e il suo blog contiene tantissime informazioni utili sulla profilazione in generale, comprese tutte le folli insidie ​​e i problemi in cui potresti imbatterti.

Altri suggerimenti

Profilers come le formiche usano un "API profilazione" presentato dal CLR stesso, che semplicemente si può dire ciò che accade all'interno del CLR. Ad esempio, v'è un callback metodo API che si verificano quando un oggetto è allocato, giustamente chiamato ObjectAllocated () . Allo stesso modo ci sono eventi per cui vengono inseriti i metodi, quando si creano discussioni, ecc ecc.

L'API di profilatura originale è chiamato ICorProfilerCallback. Le versioni successive sono chiamati CoreProfilerCallback2 e CoreProfilerCallback3. Se google quei nomi si trovano esattamente le risposte che stai cercando. Su CodeProject è possibile vedere un esempio pratico: Creazione di un personalizzato .NET Profiler

Una nota finale: l'API non può essere utilizzato dal codice gestito come C # e VB.NET. E 'disponibile solo da codice non gestito come per esempio C o C ++. Quindi un C # app non può utilizzare questa API per esaminare il proprio comportamento e oggetti, per esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top