Condividi tramite


Configurazione di un ambiente di analisi

Aggiornamento: novembre 2007

Negli argomenti precedenti, è stato descritto cosa si verifica durante l'esecuzione dell'applicazione e del profiler. Ma come vengono collegati all’avvio di un'applicazione? Common Language Runtime (CLR) stabilisce la connessione durante l'inizializzazione in ogni processo. Stabilisce se connettersi a un profiler. In tal caso, trova il profiler controllando il valore di due variabili di ambiente nell'ordine seguente:

  • 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 che ha questo CLSID o ProgID, valori memorizzati in precedenza nel Registro di sistema. La variabile di ambiente COR_PROFILER viene definita come stringa, come illustrato nei due esempi seguenti.

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

Di conseguenza, per analizzare un'applicazione CLR, è necessario impostare le variabili di ambiente COR_ENABLE_PROFILING e COR_PROFILER prima dell’esecuzione dell'applicazione. Inoltre, è necessario accertarsi che la DLL del profiler sia registrata.

Ambito delle variabili di ambiente

Le impostazioni delle variabili di ambiente COR_ENABLE_PROFILING e COR_PROFILER determineranno l'ambito di influenza. Impostare tali variabili in uno dei modi seguenti.

  • Se si impostano le variabili in una chiamata ICorDebug::CreateProcess, tali impostazioni verranno applicate soltanto all'applicazione al momento in esecuzione. Verranno applicate anche alle 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 tale finestra.

  • Se si impostano le variabili a livello di utente, verranno applicate a tutte le applicazioni avviate con Esplora risorse. Una finestra del prompt dei comandi aperta dopo avere impostato le variabili avrà queste impostazioni di ambiente e così tutte le applicazioni che verranno avviate da tale finestra. Per impostare le variabili di ambiente a livello di utente, fare clic con il pulsante destro del mouse su Risorse del computer, fare clic su Proprietà, sulla scheda Avanzate, su 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 su tale computer avrà queste impostazioni di ambiente e così tutte le applicazioni che verranno avviate da tale finestra. In altri termini, ogni processo gestito su tale computer si avvierà con il profiler definito. Per impostare le variabili di ambiente a livello di computer, fare clic con il pulsante destro del mouse su Risorse del computer, fare clic su Proprietà, sulla scheda Avanzate, su Variabili di ambiente, aggiungere le variabili all'elenco Variabili di sistema e riavviare il computer. Dopo avere riavviato il computer, le variabili saranno disponibili a livello di sistema.

Se si sta analizzando un servizio Windows, è necessario riavviare il computer dopo avere impostato le variabili di ambiente e registrato la DLL del profiler. Per ulteriori informazioni su queste considerazioni, vedere Analisi di un servizio Windows.

Considerazioni aggiuntive

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

  • Un solo profiler può analizzare un processo in un determinato momento e in un ambiente specificato. È possibile registrare due profiler diversi in ambienti diversi, ma ognuno deve analizzare processi diversi. Il profiler deve essere implementato come una DLL del server COM in-process, della quale viene eseguito il mapping nello stesso spazio degli indirizzi del processo che si sta analizzando. In altri termini, l’esecuzione del profiler è in-process. .NET Framework non supporta alcun altro tipo di server COM. Ad esempio, se un profiler desidera eseguire il monitoraggio di applicazioni da un computer remoto, deve implementare agenti collector su ogni computer. Tali agenti raggrupperanno i risultati e li comunicano al computer di raccolta dati centrale.

  • Perché il profiler è un oggetto COM per il quale è stata creata un’istanza in-process, ogni applicazione analizzata disporrà della propria copia del profiler. Di conseguenza, una singola istanza del profiler non deve gestire dati da più applicazioni. Tuttavia, sarà necessario aggiungere la qualche logica al codice di accesso del profiler per impedire che il file di log venga sovrascritto da altre applicazioni analizzate.

Inizializzazione del profiler

Una volta superati entrambi i controlli sulle variabili di ambiente, CLR crea un'istanza del profiler in modo analogo alla funzione CoCreateInstance di COM. Il profiler non viene caricato tramite una chiamata diretta a CoCreateInstance. Di conseguenza, viene evitata una chiamata a CoInitializeche 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 su pICorProfilerInfoUnk per un puntatore a interfaccia ICorProfilerInfo o ICorProfilerInfo2 e salvarla per richiedere ulteriori informazioni in un momento successivo durante l’analisi.

Impostazione delle notifiche di eventi

Il profiler chiama quindi il metodo ICorProfilerInfo::SetEventMask per specificare quali sono le categorie di notifiche interessate. Ad esempio, se il profiler è interessato solo alle notifiche di ingresso a e uscita da una funzione e alle notifiche di Garbage Collection, vengono specificati gli elementi seguenti.

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, è possibile limitare le notifiche ricevute dal profiler. Questo approccio consente all’utente di creare un profiler semplice o per uno scopo specifico. Si riduce anche il tempo CPU che verrebbe sprecato nell'invio di notifiche che verrebbero semplicemente ignorate dal profiler.

Alcuni eventi del profiler non sono modificabili. In altri termini, non appena questi eventi sono impostati nel callback di ICorProfilerCallback::Initialize, non è possibile disattivarli e non è possibile attivare nuovi eventi. I tentativi di modifica di un evento immutabile causeranno la restituzione di un HRESULT di errore da parte di ICorProfilerInfo::SetEventMask.

Vedere anche

Altre risorse

Analisi in .NET Framework

Cenni preliminari sull'analisi