Dela via


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 inte ICorProfilerCallback2 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.

Se även