Configurazione di un ambiente di profilatura

Nota

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 è necessario connettere il processo 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 si passa il controllo COR_ENABLE_PROFILING, 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 viene definita come stringa, come mostrato 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. È anche necessario assicurarsi che il file DLL del profiler sia registrato.

Nota

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

Nota

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

Ambito della variabile di ambiente

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

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

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

  • Se le variabili vengono impostate a livello di utente, verranno applicate a tutte le applicazioni avviate con Esplora file. Una finestra del prompt dei comandi aperta dopo aver impostato le variabili avrà queste impostazioni di ambiente, così come tutte le applicazioni avviate da tale finestra. Per impostare le variabili di ambiente a livello di utente, fare clic con il pulsante destro del mouse su My 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 su tale computer. Una finestra del prompt dei comandi aperta nel computer avrà le impostazioni di ambiente specificate, così come tutte le applicazioni avviate da tale finestra. Ciò significa che ogni processo gestito nel computer verrà avviato con il profiler. Per impostare le variabili di ambiente a livello di computer, fare clic con il pulsante destro del mouse su My Computer, 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 in tutto il sistema.

Se si esegue la profilatura di un servizio di 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.

Ulteriori considerazioni

  • 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 processo può essere profilato da un solo profiler in momento e in un ambiente specifici. È possibile registrare due profiler diversi in ambienti diversi, ma ognuno deve profilare processi separati. Il profiler deve essere implementato come file DLL del server COM in-process, mappato allo stesso spazio degli indirizzi del processo che si sta profilando. Ciò significa che il profiler viene eseguito in-process. .NET Framework non supporta altri tipi di server COM. Ad esempio, per monitorare le applicazioni da un computer remoto, il profiler deve implementare agenti di raccolta in ogni computer. Questi agenti raccolgono i risultati e li comunicano al computer di raccolta dati centrale.

  • Poiché il profiler è un oggetto COM di cui viene creata un'istanza in-process, ogni applicazione profilata disporrà della propria copia del profiler. Pertanto, una singola istanza del profiler non deve gestire i dati da più applicazioni. Tuttavia, sarà necessario aggiungere una logica al codice di registrazione del profiler per impedire che il file di log sia sovrascritto 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 simile alla funzione COM CoCreateInstance. Il profiler non viene caricato tramite una chiamata diretta a CoCreateInstance. Di conseguenza si evita la 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 dell'interfaccia ICorProfilerInfo o ICorProfilerInfo2 e salvarlo in modo che possa richiedere altre informazioni più avanti durante la profilatura.

Impostazione delle notifiche degli eventi

Il profiler chiama quindi il metodo ICorProfilerInfo::SetEventMask per specificare quali categorie di notifiche sono interessate. Ad esempio, se il profiler è interessato solo alle notifiche di entrata e uscita dalla funzione e alle notifiche di Garbage Collection, viene specificato quanto segue.

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

Impostando la maschera delle notifiche in questo modo, il profiler può limitare le notifiche ricevute. Questo approccio consente di compilare un profiler semplice o per scopi specifici. Riduce anche il tempo di CPU che andrebbe sprecato per l'invio di notifiche del tutto ignorate dal profiler.

Alcuni eventi del profiler non sono modificabili. Ciò significa che, non appena si impostano questi eventi nel callback ICorProfilerCallback::Initialize, non è possibile disattivarli, né attivare nuovi eventi. Se si tenta di modificare un evento non modificabile, ICorProfilerInfo::SetEventMask restituisce un HRESULT di errore.

Profilatura di un servizio Windows

La profilatura di un servizio Windows è analoga a quella di un'applicazione Common Language Runtime. Entrambe le operazioni di profilatura vengono abilitate con le 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 richiesti. Inoltre, la DLL di profilatura deve già essere registrata nel sistema.

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

Queste modifiche abiliteranno la profilatura a livello di sistema. Per evitare la profilatura di tutte le applicazioni gestite eseguite successivamente, è necessario eliminare le variabili di ambiente del sistema dopo aver riavviato il computer di destinazione.

Questa tecnica comporta anche la profilatura di tutti i processi CLR. Il profiler deve aggiungere la logica al relativo callback ICorProfilerCallback::Initialize per rilevare se il processo corrente è di interesse. Se non lo è, il profiler può interrompere il callback senza eseguire l'inizializzazione.

Vedi anche