Konfigurera en profileringsmiljö
Anteckning
Profileringen har ändrats avsevärt i .NET Framework 4.
När en hanterad process (program eller tjänst) startas läser den in CLR (Common Language Runtime). När CLR initieras utvärderas följande två miljövariabler för att avgöra om processen ska ansluta till en profilerare:
COR_ENABLE_PROFILING: CLR ansluter endast till en profilerare om den här miljövariabeln finns och är inställd på 1.
COR_PROFILER: Om COR_ENABLE_PROFILING kontrollen godkänns ansluter CLR till profileraren som har detta CLSID eller ProgID, som måste ha lagrats tidigare i registret. Miljövariabeln COR_PROFILER definieras som en sträng, enligt följande två exempel.
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
Om du vill profilera ett CLR-program måste du ange miljövariablerna COR_ENABLE_PROFILING och COR_PROFILER innan du kör programmet. Du måste också se till att profiler-DLL:en är registrerad.
Anteckning
Från och med .NET Framework 4 behöver profilerare inte registreras.
Anteckning
Om du vill använda .NET Framework versionerna 2.0, 3.0 och 3.5 profilerare i .NET Framework 4 och senare versioner måste du ange miljövariabeln COMPLUS_ProfAPI_ProfilerCompatibilitySetting.
Omfång för miljövariabel
Hur du ställer in miljövariablerna COR_ENABLE_PROFILING och COR_PROFILER avgör deras påverkansomfång. Du kan ange dessa variabler på något av följande sätt:
Om du anger variablerna i ett ICorDebug::CreateProcess-anrop gäller de endast för det program som du kör vid den tidpunkten. (De gäller även för andra program som startas av programmet som ärver miljön.)
Om du anger variablerna i ett kommandotolkfönster gäller de för alla program som startas från det fönstret.
Om du anger variablerna på användarnivå gäller de för alla program som du börjar med Utforskaren. Ett kommandotolksfönster som du öppnar när du har angett variablerna har dessa miljöinställningar, och det kommer även alla program som du startar från det fönstret. Om du vill ange miljövariabler på användarnivå högerklickar du på Min dator, klickar på Egenskaper, klickar på fliken Avancerat , klickar på Miljövariabler och lägger till variablerna i listan Användarvariabler .
Om du ställer in variablerna på datornivå gäller de för alla program som startas på datorn. Ett kommandotolksfönster som du öppnar på datorn har dessa miljöinställningar, och det kommer även alla program som du startar från det fönstret. Det innebär att varje hanterad process på datorn börjar med din profilerare. Om du vill ange miljövariabler på datornivå högerklickar du på Min dator, klickar på Egenskaper, klickar på fliken Avancerat , klickar på Miljövariabler, lägger till variablerna i listan Systemvariabler och startar sedan om datorn. När du har startat om blir variablerna tillgängliga för hela systemet.
Om du profilerar en Windows-tjänst måste du starta om datorn när du har angett miljövariablerna och registrerat profilerings-DLL:en. Mer information om dessa överväganden finns i avsnittet Profilering av en Windows-tjänst.
Ytterligare överväganden
Profiler-klassen implementerar gränssnitten ICorProfilerCallback och ICorProfilerCallback2 . I .NET Framework version 2.0 måste en profilerare implementera
ICorProfilerCallback2
. Om den inteICorProfilerCallback2
gör det läses den inte in.Endast en profilerare kan profilera en process samtidigt i en viss miljö. Du kan registrera två olika profilerare i olika miljöer, men var och en måste profilera separata processer. Profileraren måste implementeras som en processbaserad COM-server-DLL, som är mappad till samma adressutrymme som den process som profileras. Det innebär att profileraren körs i processen. .NET Framework stöder inte någon annan typ av COM-server. Om en profilerare till exempel vill övervaka program från en fjärrdator måste den implementera insamlaragenter på varje dator. Dessa agenter batchar resultat och kommunicerar dem till den centrala datainsamlingsdatorn.
Eftersom profileraren är ett COM-objekt som instansieras i processen har varje profilerat program en egen kopia av profileraren. Därför behöver inte en enda profileringsinstans hantera data från flera program. Du måste dock lägga till logik i profilerarens loggningskod för att förhindra att loggfilen skrivs över från andra profilerade program.
Initiera profileraren
När båda miljövariabeln checkar igenom skapar CLR en instans av profileraren på ett liknande sätt som COM-funktionen CoCreateInstance
. Profileraren läses inte in via ett direktanrop till CoCreateInstance
. Därför undviks ett anrop till CoInitialize
, som kräver att trådningsmodellen anges. CLR anropar sedan metoden ICorProfilerCallback::Initialize i profileraren. Signaturen för den här metoden är följande.
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
Profileraren måste fråga efter pICorProfilerInfoUnk
en ICorProfilerInfo - eller ICorProfilerInfo2-gränssnittspekare och spara den så att den kan begära mer information senare under profileringen.
Ange händelsemeddelanden
Profileraren anropar sedan metoden ICorProfilerInfo::SetEventMask för att ange vilka kategorier av meddelanden som den är intresserad av. Om profileraren till exempel bara är intresserad av funktionen anger och lämnar meddelanden och skräpinsamlingsmeddelanden anger den följande.
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
Genom att ange meddelandemasken på det här sättet kan profileraren begränsa vilka meddelanden den tar emot. Den här metoden hjälper användaren att skapa en enkel profilerare eller specialprofil. Det minskar också cpu-tid som skulle slösas bort på att skicka meddelanden som profileraren bara skulle ignorera.
Vissa profilerarhändelser är oföränderliga. Det innebär att så snart dessa händelser har angetts i återanropet ICorProfilerCallback::Initialize
kan de inte stängas av och nya händelser kan inte aktiveras. Försök att ändra en oföränderlig händelse resulterar i ICorProfilerInfo::SetEventMask
att en misslyckad HRESULT returneras.
Profilering av en Windows-tjänst
Profilering av en Windows-tjänst är som att profilera ett vanligt språkkörningsprogram. Båda profileringsåtgärderna aktiveras via miljövariabler. Eftersom en Windows-tjänst startas när operativsystemet startar måste miljövariablerna som beskrivs tidigare i det här avsnittet redan finnas och anges till de värden som krävs innan systemet startar. Dessutom måste profilerings-DLL redan vara registrerad i systemet.
När du har angett miljövariablerna COR_ENABLE_PROFILING och COR_PROFILER och registrerat profilerings-DLL:en bör du starta om måldatorn så att Windows-tjänsten kan identifiera dessa ändringar.
Observera att dessa ändringar möjliggör profilering på systemomfattande basis. Om du vill förhindra att alla hanterade program som senare körs profileras bör du ta bort systemmiljövariablerna när du har startat om måldatorn.
Den här tekniken leder också till att varje CLR-process blir profilerad. Profileraren bör lägga till logik i sin ICorProfilerCallback::Initiera återanrop för att identifiera om den aktuella processen är av intresse. Om det inte är det kan profileraren misslyckas med återanropet utan att utföra initieringen.