Condividi tramite


Configurazione di un ambiente di profilatura

Annotazioni

Sono state apportate modifiche sostanziali alla profilatura in .NET Framework 4.

Quando viene avviato un processo gestito (applicazione o servizio), viene caricato Common Language Runtime (CLR). Quando CLR viene inizializzato, valuta le due variabili di ambiente seguenti per decidere se il processo deve connettersi a un profiler:

  • COR_ENABLE_PROFILING: CLR si connette a un profiler solo se questa variabile di ambiente esiste ed è impostata su 1.

  • COR_PROFILER: se il controllo COR_ENABLE_PROFILING viene superato, CLR si connette al profiler con questo CLSID o ProgID, che deve essere stato archiviato in precedenza nel Registro di sistema. La variabile di ambiente COR_PROFILER è definita come stringa, come illustrato nei due esempi seguenti.

    set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A}
    set COR_PROFILER="MyProfiler"
    

Per profilare un'applicazione CLR, è necessario impostare le variabili di ambiente COR_ENABLE_PROFILING e COR_PROFILER prima di eseguire l'applicazione. È inoltre necessario assicurarsi che la DLL del profiler sia registrata.

Annotazioni

A partire da .NET Framework 4, i profiler non devono essere registrati.

Annotazioni

Per usare i profiler .NET Framework versione 2.0, 3.0 e 3.5 in .NET Framework 4 e versioni successive, è necessario impostare la variabile di ambiente COMPLUS_ProfAPI_ProfilerCompatibilitySetting.

Ambito variabile di ambiente

La modalità di impostazione delle variabili di ambiente COR_ENABLE_PROFILING e COR_PROFILER determinerà l'ambito di influenza. È possibile impostare queste variabili in uno dei modi seguenti:

  • Se si impostano le variabili in una chiamata ICorDebug::CreateProcess , queste verranno applicate solo all'applicazione in esecuzione al momento. Si applicano anche ad altre applicazioni avviate dall'applicazione che ereditano l'ambiente.

  • Se si impostano le variabili in una finestra del prompt dei comandi, queste verranno applicate a tutte le applicazioni avviate da tale finestra.

  • Se si impostano le variabili a livello di utente, queste verranno applicate a tutte le applicazioni che si iniziano con Esplora file. Una finestra del prompt dei comandi aperta dopo aver impostato le variabili avrà queste impostazioni di ambiente e quindi qualsiasi applicazione che si avvia da tale finestra. Per impostare le variabili di ambiente a livello di utente, fare clic con il pulsante destro del mouse su Computer, scegliere Proprietà, fare clic sulla scheda Avanzate , scegliere Variabili di ambiente e aggiungere le variabili all'elenco Variabili utente .

  • Se si impostano le variabili a livello di computer, verranno applicate a tutte le applicazioni avviate nel computer. Una finestra del prompt dei comandi aperta nel computer avrà queste impostazioni di ambiente e quindi qualsiasi applicazione che si avvia da tale finestra. Ciò significa che ogni processo gestito in quel computer inizierà con il profiler. Per impostare le variabili di ambiente a livello di computer, fare clic con il pulsante destro del mouse su Computer, scegliere Proprietà, fare clic sulla scheda Avanzate , scegliere Variabili di ambiente, aggiungere le variabili all'elenco Variabili di sistema e quindi riavviare il computer. Dopo il riavvio, le variabili saranno disponibili a livello di sistema.

Se si esegue la profilatura di un servizio Windows, è necessario riavviare il computer dopo aver impostato le variabili di ambiente e registrare la DLL del profiler. Per altre informazioni su queste considerazioni, vedere la sezione Profilatura di un servizio Windows.

Considerazioni aggiuntive

  • La classe profiler implementa le interfacce ICorProfilerCallback e ICorProfilerCallback2 . In .NET Framework versione 2.0, un profiler deve implementare ICorProfilerCallback2. In caso contrario, ICorProfilerCallback2 non verrà caricato.

  • Un solo profiler può profilarne uno alla volta in un determinato ambiente. È possibile registrare due profiler diversi in ambienti diversi, ma ognuno deve profilarsi processi separati. Il profiler deve essere implementato come DLL del server COM in-process, mappato nello stesso spazio indirizzi del processo sottoposto a profilatura. Ciò significa che il profiler viene eseguito in-process. .NET Framework non supporta altri tipi di server COM. Ad esempio, se un profiler vuole monitorare le applicazioni da un computer remoto, deve implementare agenti agente di raccolta in ogni computer. Questi agenti batchranno i risultati e li comunicheranno al computer di raccolta dati centrale.

  • Poiché il profiler è un oggetto COM di cui è stata creata un'istanza in-process, ogni applicazione profilata avrà una propria copia del profiler. Pertanto, una singola istanza del profiler non deve gestire i dati da più applicazioni. Tuttavia, sarà necessario aggiungere logica al codice di registrazione del profiler per impedire la sovrascrittura dei file di log da altre applicazioni profilate.

Inizializzazione del profiler

Quando vengono superati entrambi i controlli delle variabili di ambiente, CLR crea un'istanza del profiler in modo analogo alla funzione COM CoCreateInstance . Il profiler non viene caricato tramite una chiamata diretta a CoCreateInstance. Pertanto, viene evitata una chiamata a CoInitialize, che richiede l'impostazione del modello di threading. CLR chiama quindi il metodo ICorProfilerCallback::Initialize nel profiler. La firma di questo metodo è la seguente.

HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)

Il profiler deve eseguire una query pICorProfilerInfoUnk per un puntatore all'interfaccia ICorProfilerInfo o ICorProfilerInfo2 e salvarlo in modo che possa richiedere altre informazioni in un secondo momento durante la profilatura.

Impostazione delle notifiche degli eventi

Il profiler chiama quindi il metodo ICorProfilerInfo::SetEventMask per specificare le categorie di notifiche a cui è interessato. Ad esempio, se il profiler è interessato solo all'immissione della funzione e lasciare le notifiche e le notifiche di Garbage Collection, specifica quanto segue.

ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)

Impostando la maschera notifiche in questo modo, il profiler può limitare le notifiche ricevute. Questo approccio consente all'utente di creare un profiler semplice o speciale. Riduce anche il tempo di CPU che verrebbe sprecato inviando notifiche che il profiler ignorava.

Alcuni eventi del profiler non sono modificabili. Ciò significa che non appena questi eventi vengono impostati nel ICorProfilerCallback::Initialize callback, non possono essere disattivati e non è possibile attivare nuovi eventi. I tentativi di modificare un evento non modificabile restituiranno ICorProfilerInfo::SetEventMask un HRESULT non riuscito.

Profilatura di un servizio Windows

La profilatura di un servizio Windows è simile alla profilatura di un'applicazione Common Language Runtime. Entrambe le operazioni di profilatura sono abilitate tramite variabili di ambiente. Poiché un servizio Windows viene avviato all'avvio del sistema operativo, le variabili di ambiente descritte in precedenza in questo argomento devono essere già presenti e impostate sui valori necessari prima dell'avvio del sistema. Inoltre, la DLL di profilatura deve essere già registrata nel sistema.

Dopo aver impostato le COR_ENABLE_PROFILING e COR_PROFILER variabili di ambiente e registrare la DLL del profiler, è necessario riavviare il computer di destinazione in modo che il servizio Windows possa rilevare tali modifiche.

Si noti che queste modifiche consentiranno la profilatura a livello di sistema. Per evitare che ogni applicazione gestita che successivamente viene eseguita per la profilatura, è necessario eliminare le variabili di ambiente di sistema dopo il riavvio del computer di destinazione.

Questa tecnica comporta anche la profilatura di ogni processo CLR. Il profiler deve aggiungere logica al callback ICorProfilerCallback::Initialize per rilevare se il processo corrente è di interesse. In caso contrario, il profiler può non riuscire il callback senza eseguire l'inizializzazione.

Vedere anche