Udostępnij za pośrednictwem


Konfigurowanie środowiska profilowania

Uwaga

W .NET Framework 4 wprowadzono istotne zmiany w profilowaniu.

Po uruchomieniu zarządzanego procesu (aplikacji lub usługi) ładuje środowisko uruchomieniowe języka wspólnego (CLR). Po zainicjowaniu środowiska CLR ocenia następujące dwie zmienne środowiskowe, aby zdecydować, czy proces powinien nawiązać połączenie z profilerem:

  • COR_ENABLE_PROFILING: CLR łączy się z profilerem tylko wtedy, gdy ta zmienna środowiskowa istnieje i jest ustawiona na 1.

  • COR_PROFILER: jeśli sprawdzanie COR_ENABLE_PROFILING przejdzie pomyślnie, clR łączy się z profilerem, który ma ten identyfikator CLSID lub ProgID, który musi być przechowywany wcześniej w rejestrze. Zmienna środowiskowa COR_PROFILER jest definiowana jako ciąg, jak pokazano w dwóch poniższych przykładach.

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

Aby profilować aplikację CLR, należy ustawić COR_ENABLE_PROFILING i COR_PROFILER zmienne środowiskowe przed uruchomieniem aplikacji. Należy również upewnić się, że biblioteka DLL profilera jest zarejestrowana.

Uwaga

Począwszy od .NET Framework 4, profileery nie muszą być zarejestrowane.

Uwaga

Aby używać profilów .NET Framework w wersji 2.0, 3.0 i 3.5 w .NET Framework 4 i nowszych wersjach, należy ustawić zmienną środowiskową COMPLUS_ProfAPI_ProfilerCompatibilitySetting.

Zakres zmiennej środowiskowej

Sposób ustawiania COR_ENABLE_PROFILING i COR_PROFILER zmiennych środowiskowych określi ich zakres wpływu. Te zmienne można ustawić na jeden z następujących sposobów:

  • Jeśli ustawisz zmienne w wywołaniu ICorDebug::CreateProcess , będą one stosowane tylko do aplikacji, która jest uruchomiona w tym czasie. (Będą one również stosowane do innych aplikacji uruchomionych przez tę aplikację, która dziedziczy środowisko).

  • Jeśli ustawisz zmienne w oknie wiersza polecenia, będą one stosowane do wszystkich aplikacji, które są uruchamiane z tego okna.

  • Jeśli ustawisz zmienne na poziomie użytkownika, będą one stosowane do wszystkich aplikacji, które zaczynają się od Eksplorator plików. Okno wiersza polecenia otwierane po ustawieniu zmiennych będzie miało te ustawienia środowiska, a więc każda aplikacja, którą rozpoczniesz od tego okna. Aby ustawić zmienne środowiskowe na poziomie użytkownika, kliknij prawym przyciskiem myszy pozycję Mój komputer, kliknij przycisk Właściwości, kliknij kartę Zaawansowane , kliknij pozycję Zmienne środowiskowe i dodaj zmienne do listy Zmienne użytkownika .

  • Jeśli ustawisz zmienne na poziomie komputera, będą one stosowane do wszystkich aplikacji uruchomionych na tym komputerze. Otwarte na tym komputerze okno wiersza polecenia będzie miało te ustawienia środowiska, a więc każda aplikacja, która zostanie uruchomiona z tego okna. Oznacza to, że każdy zarządzany proces na tym komputerze rozpocznie się od profilera. Aby ustawić zmienne środowiskowe na poziomie komputera, kliknij prawym przyciskiem myszy pozycję Mój komputer, kliknij przycisk Właściwości, kliknij kartę Zaawansowane , kliknij pozycję Zmienne środowiskowe, dodaj zmienne do listy Zmienne systemowe , a następnie uruchom ponownie komputer. Po ponownym uruchomieniu zmienne będą dostępne dla całego systemu.

W przypadku profilowania usługi systemu Windows należy ponownie uruchomić komputer po ustawieniu zmiennych środowiskowych i zarejestrowaniu biblioteki DLL profilera. Aby uzyskać więcej informacji na temat tych zagadnień, zobacz sekcję Profilowanie usługi systemu Windows.

Dodatkowe zagadnienia

  • Klasa profilera implementuje interfejsy ICorProfilerCallback i ICorProfilerCallback2 . W .NET Framework wersji 2.0 profiler musi zaimplementować element ICorProfilerCallback2. Jeśli tak nie jest, ICorProfilerCallback2 nie zostanie załadowany.

  • Tylko jeden profiler może profilować proces jednocześnie w danym środowisku. Można zarejestrować dwa różne profileery w różnych środowiskach, ale każdy z nich musi profilować oddzielne procesy. Profiler musi być zaimplementowany jako biblioteka DLL serwera COM w procesie, która jest mapowana na tę samą przestrzeń adresową co profilowany proces. Oznacza to, że profiler działa w procesie. .NET Framework nie obsługuje żadnego innego typu serwera COM. Jeśli na przykład profiler chce monitorować aplikacje z komputera zdalnego, musi zaimplementować agentów modułu zbierającego na każdym komputerze. Agenci będą wsadowywać wyniki i przekazywać je do centralnego komputera zbierania danych.

  • Ponieważ profiler jest obiektem COM, który jest tworzone w procesie, każda profilowana aplikacja będzie mieć własną kopię profilera. W związku z tym pojedyncze wystąpienie profilera nie musi obsługiwać danych z wielu aplikacji. Należy jednak dodać logikę do kodu rejestrowania profilera, aby zapobiec zastąpieniu pliku dziennika z innych profilowanych aplikacji.

Inicjowanie profilera

Gdy obie zmienne środowiskowe przejdą, clR tworzy wystąpienie profilera w podobny sposób do funkcji COM CoCreateInstance . Profiler nie jest ładowany za pośrednictwem bezpośredniego wywołania metody CoCreateInstance. W związku z tym unika się wywołania CoInitializemetody , która wymaga ustawienia modelu wątkowania. Następnie clR wywołuje metodę ICorProfilerCallback::Initialize w profilerze. Podpis tej metody jest następujący.

HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)  

Profiler musi wykonać zapytanie pICorProfilerInfoUnk dotyczące wskaźnika interfejsu ICorProfilerInfolub ICorProfilerInfo2 i zapisać go, aby można było zażądać dodatkowych informacji później podczas profilowania.

Ustawianie powiadomień o zdarzeniach

Następnie profiler wywołuje metodę ICorProfilerInfo::SetEventMask , aby określić, które kategorie powiadomień są interesujące. Jeśli na przykład profiler jest zainteresowany tylko wprowadzaniem funkcji i pozostawianie powiadomień i powiadomień dotyczących odzyskiwania pamięci, określa następujące informacje.

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

Ustawiając maskę powiadomień w ten sposób, profiler może ograniczyć otrzymywane powiadomienia. Takie podejście pomaga użytkownikowi w tworzeniu prostego lub specjalnego profilera. Skraca to również czas procesora CPU, który zmarnowałby wysyłanie powiadomień, które profiler po prostu zignorował.

Niektóre zdarzenia profilera są niezmienne. Oznacza to, że po ustawieniu tych zdarzeń w wywołaniu ICorProfilerCallback::Initialize zwrotnym nie można ich wyłączyć i nie można włączyć nowych zdarzeń. Próby zmiany niezmiennego zdarzenia spowodują ICorProfilerInfo::SetEventMask zwrócenie błędu HRESULT.

Profilowanie usługi systemu Windows

Profilowanie usługi systemu Windows przypomina profilowanie aplikacji środowiska uruchomieniowego języka wspólnego. Obie operacje profilowania są włączone za pomocą zmiennych środowiskowych. Ponieważ usługa systemu Windows jest uruchamiana po uruchomieniu systemu operacyjnego, zmienne środowiskowe omówione wcześniej w tym temacie muszą być już obecne i ustawione na wymagane wartości przed uruchomieniem systemu. Ponadto biblioteka DLL profilowania musi być już zarejestrowana w systemie.

Po ustawieniu COR_ENABLE_PROFILING i COR_PROFILER zmiennych środowiskowych i zarejestrowaniu biblioteki DLL profilera należy ponownie uruchomić komputer docelowy, aby usługa systemu Windows mogła wykryć te zmiany.

Należy pamiętać, że te zmiany umożliwią profilowanie w całym systemie. Aby zapobiec profilowaniu każdej aplikacji zarządzanej, należy usunąć zmienne środowiskowe systemu po ponownym uruchomieniu komputera docelowego.

Ta technika prowadzi również do profilowania każdego procesu CLR. Profiler powinien dodać logikę do wywołania zwrotnego ICorProfilerCallback::Initialize w celu wykrycia, czy bieżący proces jest interesujący. Jeśli tak nie jest, profiler może zakończyć się niepowodzeniem wywołania zwrotnego bez wykonania inicjowania.

Zobacz też