Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Es gab erhebliche Änderungen an der Profilerstellung in .NET Framework 4.
Wenn ein verwalteter Prozess (Anwendung oder Dienst) gestartet wird, wird die Common Language Runtime (CLR) geladen. Wenn die CLR initialisiert wird, werden die folgenden beiden Umgebungsvariablen ausgewertet, um zu entscheiden, ob der Prozess eine Verbindung mit einem Profiler herstellen soll:
COR_ENABLE_PROFILING: Die CLR stellt nur dann eine Verbindung mit einem Profiler bereit, wenn diese Umgebungsvariable vorhanden ist und auf 1 festgelegt ist.
COR_PROFILER: Wenn die COR_ENABLE_PROFILING Prüfung bestanden ist, stellt die CLR eine Verbindung mit dem Profiler her, der über diese CLSID oder ProgID verfügt, die zuvor in der Registrierung gespeichert sein muss. Die COR_PROFILER Umgebungsvariable ist wie in den folgenden beiden Beispielen als Zeichenfolge definiert.
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
Um eine CLR-Anwendung zu profilieren, müssen Sie die COR_ENABLE_PROFILING und COR_PROFILER Umgebungsvariablen festlegen, bevor Sie die Anwendung ausführen. Sie müssen auch sicherstellen, dass die Profiler-DLL registriert ist.
Hinweis
Ab .NET Framework 4 müssen Profiler nicht registriert werden.
Hinweis
Um .NET Framework-Versionen 2.0, 3.0 und 3.5 Profiler in .NET Framework 4 und höheren Versionen zu verwenden, müssen Sie die COMPLUS_ProfAPI_ProfilerCompatibilitySetting Umgebungsvariable festlegen.
Umgebungsvariabler Bereich
Wie Sie die COR_ENABLE_PROFILING und COR_PROFILER Umgebungsvariablen festlegen, wird deren Einflussbereich bestimmt. Sie können diese Variablen auf eine der folgenden Arten festlegen:
Wenn Sie die Variablen in einem ICorDebug::CreateProcess-Aufruf festlegen, gelten sie nur für die Anwendung, die Sie zurzeit ausführen. (Sie gelten auch für andere Anwendungen, die von dieser Anwendung gestartet werden, die die Umgebung erben.)
Wenn Sie die Variablen in einem Eingabeaufforderungsfenster festlegen, gelten sie für alle Anwendungen, die aus diesem Fenster gestartet werden.
Wenn Sie die Variablen auf Benutzerebene festlegen, gelten sie für alle Anwendungen, die Sie mit dem Datei-Explorer beginnen. Ein Eingabeaufforderungsfenster, das Sie öffnen, nachdem Sie die Variablen festgelegt haben, verfügen über diese Umgebungseinstellungen, und daher wird jede Anwendung, die Sie aus diesem Fenster starten. Wenn Sie Umgebungsvariablen auf Benutzerebene festlegen möchten, klicken Sie mit der rechten Maustaste auf "Arbeitsplatz", klicken Sie auf " Eigenschaften", klicken Sie auf die Registerkarte " Erweitert ", klicken Sie auf "Umgebungsvariablen", und fügen Sie der Liste " Benutzervariablen " die Variablen hinzu.
Wenn Sie die Variablen auf Computerebene festlegen, gelten sie für alle Anwendungen, die auf diesem Computer gestartet werden. Ein Eingabeaufforderungsfenster, das Sie auf diesem Computer öffnen, verfügt über diese Umgebungseinstellungen, und daher wird jede Anwendung, die Sie aus diesem Fenster starten. Dies bedeutet, dass jeder verwaltete Prozess auf diesem Computer mit Ihrem Profiler beginnt. Wenn Sie Umgebungsvariablen auf Computerebene festlegen möchten, klicken Sie mit der rechten Maustaste auf "Arbeitsplatz", klicken Sie auf " Eigenschaften", klicken Sie auf die Registerkarte " Erweitert ", klicken Sie auf " Umgebungsvariablen", fügen Sie der Liste " Systemvariablen " die Variablen hinzu, und starten Sie den Computer neu. Nach dem Neustart sind die Variablen systemweit verfügbar.
Wenn Sie ein Windows-Dienst profilieren, müssen Sie den Computer neu starten, nachdem Sie die Umgebungsvariablen festgelegt und die Profiler-DLL registriert haben. Weitere Informationen zu diesen Überlegungen finden Sie im Abschnitt "Profilerstellung für einen Windows-Dienst".
Weitere Überlegungen
Die Profiler-Klasse implementiert die ICorProfilerCallback - und ICorProfilerCallback2-Schnittstellen . In .NET Framework, Version 2.0, muss ein Profiler implementieren
ICorProfilerCallback2. Wenn dies nicht der Fall ist,ICorProfilerCallback2wird sie nicht geladen.Nur ein Profiler kann einen Prozess gleichzeitig in einer bestimmten Umgebung profilen. Sie können zwei verschiedene Profiler in unterschiedlichen Umgebungen registrieren, müssen jedoch jeweils separate Prozesse profilieren. Der Profiler muss als prozessinterne COM-Server-DLL implementiert werden, die demselben Adressraum zugeordnet ist wie der Prozess, der profiliert wird. Dies bedeutet, dass der Profiler im Prozess ausgeführt wird. .NET Framework unterstützt keinen anderen COM-Servertyp. Wenn ein Profiler beispielsweise Anwendungen von einem Remotecomputer überwachen möchte, muss er Sammel-Agents auf jedem Computer implementieren. Diese Agents werden Ergebnisse stapeln und an den zentralen Datensammlungscomputer kommunizieren.
Da es sich bei dem Profiler um ein COM-Objekt handelt, das in einem Prozess instanziiert wird, verfügt jede profilierte Anwendung über eine eigene Kopie des Profilers. Daher muss eine einzelne Profilerinstanz keine Daten aus mehreren Anwendungen verarbeiten. Sie müssen jedoch logik zum Protokollierungscode des Profilers hinzufügen, um zu verhindern, dass Protokolldateiüberschreibungen von anderen profilierten Anwendungen überschrieben werden.
Initialisieren des Profilers
Wenn beide Umgebungsvariablen überprüft werden, erstellt die CLR eine Instanz des Profilers auf ähnliche Weise wie die COM-Funktion CoCreateInstance . Der Profiler wird nicht über einen direkten Aufruf geladen.CoCreateInstance Daher wird ein Aufruf von CoInitialize, der das Festlegen des Threadingmodells erfordert, vermieden. Die CLR ruft dann die ICorProfilerCallback::Initialize-Methode im Profiler auf. Die Signatur dieser Methode lautet wie folgt.
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
Der Profiler muss einen ICorProfilerInfo- oder ICorProfilerInfo2-Schnittstellenzeiger abfragen pICorProfilerInfoUnk und speichern, damit er später während der Profilerstellung weitere Informationen anfordern kann.
Festlegen von Ereignisbenachrichtigungen
Der Profiler ruft dann die ICorProfilerInfo::SetEventMask-Methode auf, um anzugeben, an welchen Kategorien von Benachrichtigungen es interessiert ist. Wenn der Profiler beispielsweise nur an Funktionseingaben interessiert ist und Benachrichtigungen und Garbage Collection-Benachrichtigungen belässt, gibt er Folgendes an.
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
Durch Festlegen des Benachrichtigungsformats auf diese Weise kann der Profiler einschränken, welche Benachrichtigungen er empfängt. Dieser Ansatz hilft dem Benutzer, einen einfachen oder speziellen Profiler zu erstellen. Außerdem wird die CPU-Zeit reduziert, die das Senden von Benachrichtigungen verschwendet, die der Profiler einfach ignorieren würde.
Bestimmte Profilerereignisse sind unveränderlich. Dies bedeutet, dass diese Ereignisse, sobald diese Ereignisse im ICorProfilerCallback::Initialize Rückruf festgelegt werden, nicht deaktiviert werden können und neue Ereignisse nicht aktiviert werden können. Versuche, ein unveränderliches Ereignis zu ändern, führt dazu ICorProfilerInfo::SetEventMask , dass ein fehlerhaftes HRESULT zurückgegeben wird.
Profilieren eines Windows-Diensts
Das Profilieren eines Windows-Diensts ist wie das Profilieren einer Common Language Runtime-Anwendung. Beide Profilerstellungsvorgänge werden über Umgebungsvariablen aktiviert. Da beim Starten des Betriebssystems ein Windows-Dienst gestartet wird, müssen die zuvor in diesem Thema beschriebenen Umgebungsvariablen bereits vorhanden sein und vor dem Systemstart auf die erforderlichen Werte festgelegt sein. Darüber hinaus muss die Profilerstellungs-DLL bereits auf dem System registriert werden.
Nachdem Sie die COR_ENABLE_PROFILING- und COR_PROFILER Umgebungsvariablen festgelegt und die Profiler-DLL registriert haben, sollten Sie den Zielcomputer neu starten, damit der Windows-Dienst diese Änderungen erkennen kann.
Beachten Sie, dass diese Änderungen die Profilerstellung auf systemweiter Basis ermöglichen. Um zu verhindern, dass jede verwaltete Anwendung, die anschließend ausgeführt wird, profiliert wird, sollten Sie die Systemumgebungsvariablen löschen, nachdem Sie den Zielcomputer neu gestartet haben.
Diese Technik führt auch zu jedem CLR-Prozess, der profiliert wird. Der Profiler sollte dem ICorProfilerCallback::Initialize-Rückruf Logik hinzufügen, um zu erkennen, ob der aktuelle Prozess von Interesse ist. Ist dies nicht der Fehler, kann der Profiler den Rückruf nicht ausführen, ohne die Initialisierung auszuführen.