Een profileringsomgeving instellen
Notitie
De profilering is aanzienlijk gewijzigd in de .NET Framework 4.
Wanneer een beheerd proces (toepassing of service) wordt gestart, wordt de COMMON Language Runtime (CLR) geladen. Wanneer de CLR wordt geïnitialiseerd, worden de volgende twee omgevingsvariabelen geëvalueerd om te bepalen of het proces verbinding moet maken met een profiler:
COR_ENABLE_PROFILING: De CLR maakt alleen verbinding met een profiler als deze omgevingsvariabele bestaat en is ingesteld op 1.
COR_PROFILER: als de COR_ENABLE_PROFILING controle is geslaagd, maakt de CLR verbinding met de profiler die deze CLSID of ProgID heeft, die eerder in het register moet zijn opgeslagen. De omgevingsvariabele COR_PROFILER wordt gedefinieerd als een tekenreeks, zoals wordt weergegeven in de volgende twee voorbeelden.
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
Als u een CLR-toepassing wilt profilen, moet u de omgevingsvariabelen COR_ENABLE_PROFILING en COR_PROFILER instellen voordat u de toepassing uitvoert. U moet er ook voor zorgen dat de profiler-DLL is geregistreerd.
Notitie
Vanaf de .NET Framework 4 hoeven profilers niet te worden geregistreerd.
Notitie
Als u .NET Framework versies 2.0, 3.0 en 3.5-profilers in de .NET Framework 4 en latere versies wilt gebruiken, moet u de omgevingsvariabele COMPLUS_ProfAPI_ProfilerCompatibilitySetting instellen.
Bereik van omgevingsvariabelen
De wijze waarop u de COR_ENABLE_PROFILING en COR_PROFILER omgevingsvariabelen instelt, bepaalt hun invloedsbereik. U kunt deze variabelen op een van de volgende manieren instellen:
Als u de variabelen instelt in een ICorDebug::CreateProcess-aanroep , zijn ze alleen van toepassing op de toepassing die u op dat moment uitvoert. (Ze zijn ook van toepassing op andere toepassingen die door die toepassing zijn gestart en die de omgeving overnemen.)
Als u de variabelen instelt in een opdrachtpromptvenster, zijn ze van toepassing op alle toepassingen die vanuit dat venster worden gestart.
Als u de variabelen instelt op gebruikersniveau, zijn ze van toepassing op alle toepassingen die u start met Bestandenverkenner. Een opdrachtpromptvenster dat u opent nadat u de variabelen hebt ingesteld, bevat deze omgevingsinstellingen, net als elke toepassing die u vanuit dat venster start. Als u omgevingsvariabelen wilt instellen op gebruikersniveau, klikt u met de rechtermuisknop op Deze computer, klikt u op Eigenschappen, klikt u op het tabblad Geavanceerd , klikt u op Omgevingsvariabelen en voegt u de variabelen toe aan de lijst Gebruikersvariabelen .
Als u de variabelen instelt op computerniveau, zijn ze van toepassing op alle toepassingen die op die computer worden gestart. Een opdrachtpromptvenster dat u op die computer opent, bevat deze omgevingsinstellingen, net als elke toepassing die u vanuit dat venster start. Dit betekent dat elk beheerd proces op die computer begint met uw profiler. Als u omgevingsvariabelen op computerniveau wilt instellen, klikt u met de rechtermuisknop op Deze computer, klikt u op Eigenschappen, klikt u op het tabblad Geavanceerd , klikt u op Omgevingsvariabelen, voegt u de variabelen toe aan de lijst Systeemvariabelen en start u de computer opnieuw op. Na het opnieuw opstarten zijn de variabelen systeembreed beschikbaar.
Als u een Windows-service profileert, moet u de computer opnieuw opstarten nadat u de omgevingsvariabelen hebt ingesteld en de profiler-DLL hebt geregistreerd. Zie de sectie Een Windows-service profileren voor meer informatie over deze overwegingen.
Aanvullende overwegingen
De profiler-klasse implementeert de interfaces ICorProfilerCallback en ICorProfilerCallback2 . In .NET Framework versie 2.0 moet een profiler implementeren
ICorProfilerCallback2
. Als dit niet het geval is,ICorProfilerCallback2
wordt niet geladen.Slechts één profiler kan een proces in één keer in een bepaalde omgeving profileerden. U kunt twee verschillende profilers in verschillende omgevingen registreren, maar elk daarvan moet afzonderlijke processen profilen. De profiler moet worden geïmplementeerd als een IN-process COM-server DLL, die is toegewezen aan dezelfde adresruimte als het proces dat wordt geprofileerd. Dit betekent dat de profiler in verwerking wordt uitgevoerd. De .NET Framework biedt geen ondersteuning voor een ander type COM-server. Als een profiler bijvoorbeeld toepassingen vanaf een externe computer wil bewaken, moet deze collectoragents op elke computer implementeren. Deze agents zullen resultaten batchgewijs verwerken en deze doorgeven aan de centrale computer voor gegevensverzameling.
Omdat de profiler een COM-object is dat in de verwerking wordt geïnstantieerd, heeft elke geprofileerde toepassing een eigen kopie van de profiler. Daarom hoeft één instantie van de profiler geen gegevens van meerdere toepassingen te verwerken. U moet echter logica toevoegen aan de logboekcode van de profiler om te voorkomen dat logboekbestanden van andere geprofileerde toepassingen worden overschreven.
De Profiler initialiseren
Wanneer beide omgevingsvariabelecontroles slagen, maakt de CLR een instantie van de profiler op een vergelijkbare manier als de functie COM CoCreateInstance
. De profiler wordt niet geladen via een directe aanroep naar CoCreateInstance
. Daarom wordt een aanroep van CoInitialize
, waarvoor het threadingmodel moet worden ingesteld, vermeden. De CLR roept vervolgens de methode ICorProfilerCallback::Initialize aan in de profiler. De handtekening van deze methode is als volgt.
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
De profiler moet een query uitvoeren pICorProfilerInfoUnk
voor een ICorProfilerInfo - of ICorProfilerInfo2-interfaceaanwijzer en deze opslaan, zodat deze later tijdens het profileren meer informatie kan aanvragen.
Gebeurtenismeldingen instellen
De profiler roept vervolgens de methode ICorProfilerInfo::SetEventMask aan om op te geven in welke categorieën meldingen het is geïnteresseerd. Als de profiler bijvoorbeeld alleen geïnteresseerd is in functie enter- en leave-meldingen en garbagecollectionmeldingen, wordt het volgende opgegeven.
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
Door het meldingenmasker op deze manier in te stellen, kan de profiler beperken welke meldingen hij ontvangt. Deze benadering helpt de gebruiker bij het bouwen van een eenvoudige of speciale profiler. Het vermindert ook DE CPU-tijd die verspild zou zijn met het verzenden van meldingen die de profiler gewoon zou negeren.
Bepaalde profiler-gebeurtenissen zijn onveranderbaar. Dit betekent dat zodra deze gebeurtenissen zijn ingesteld in de ICorProfilerCallback::Initialize
callback, ze niet kunnen worden uitgeschakeld en nieuwe gebeurtenissen niet kunnen worden ingeschakeld. Pogingen om een onveranderbare gebeurtenis te wijzigen, resulteren in ICorProfilerInfo::SetEventMask
het retourneren van een mislukte HRESULT.
Een Windows-service profileren
Het profileren van een Windows-service is hetzelfde als het profileren van een runtime-toepassing voor een algemene taal. Beide profileringsbewerkingen worden ingeschakeld via omgevingsvariabelen. Omdat een Windows-service wordt gestart wanneer het besturingssysteem wordt gestart, moeten de omgevingsvariabelen die eerder in dit onderwerp zijn besproken, al aanwezig zijn en ingesteld op de vereiste waarden voordat het systeem wordt gestart. Bovendien moet de profilerings-DLL al zijn geregistreerd op het systeem.
Nadat u de COR_ENABLE_PROFILING en COR_PROFILER omgevingsvariabelen hebt ingesteld en de profiler-DLL hebt geregistreerd, moet u de doelcomputer opnieuw opstarten, zodat de Windows-service deze wijzigingen kan detecteren.
Houd er rekening mee dat deze wijzigingen profilering voor het hele systeem mogelijk maken. Als u wilt voorkomen dat elke beheerde toepassing die vervolgens wordt uitgevoerd, wordt geprofileerd, moet u de systeemomgevingsvariabelen verwijderen nadat u de doelcomputer opnieuw hebt opgestart.
Deze techniek leidt er ook toe dat elk CLR-proces wordt geprofileerd. De profiler moet logica toevoegen aan de ICorProfilerCallback::Initialize callback om te detecteren of het huidige proces van belang is. Als dat niet zo is, kan de profiler de callback mislukken zonder de initialisatie uit te voeren.