Frage

ich die ANTS mit Profilierwerkzeuge für Produktionsarbeiten vor kurzem begonnen. Abgesehen von ihren awesomeness erstaunt ist, konnte ich nicht helfen, aber frage mich, wie sie funktionieren. Zum Beispiel, eine der nützlichsten Funktionen können Sie die globalen Wurzeln eines laufenden Programm komplett mit der Zahl der Verweise auf Werte verschiedenen Typen visualisieren.

Wie funktioniert dieses Tool habhaft diese Informationen?

War es hilfreich?

Lösung

(Full Disclosure: Ich bin auf dem Visual Studio Profiler Team, aber die folgenden Informationen ist öffentlich)

Sie können dies tun, indem Sie einen CLR-Profiler zu schreiben, dass Läufe innerhalb des Prozesses Sie Targeting. CLR Profiler ist C ++ COM-Objekte, die von der Laufzeit instanziiert werden, wenn das COR_PROFILER und COR_PROFILING_ENABLED Umgebungsvariablen gesetzt ist (siehe hier ). Es gibt zwei Haupt CLR Profilierungs Schnittstellen , insbesondere ICorProfilerCallback und ICorProfilerInfo . ICorProfilerCallback ist, was die CLR Anwendungen Sie über bestimmte Ereignisse zu informieren, dass Sie (Modul lädt, Funktion JIT compliation, Thread-Erzeugung, GC Ereignisse) zu abonnieren, während ICorProfilerInfo können von Ihrem Profiler verwendet werden, um zusätzliche Informationen zu Themen zu erhalten, Module, Typen, Methoden und Metadaten für die geladenen Baugruppen. Diese Schnittstelle ist, was Sie könnte Verwendung zugeordnet Symbol Informationen über die Arten zu erhalten.

Mit Ihrem Profiler in-Prozess, können Sie eine GC durch ICorProfilerInfo::ForceGC . Nach der GC abgeschlossen ist, wird Ihr Profiler über ICorProfilerCallback2::GarbageCollectionFinished benachrichtigt, und Sie werden die Wurzel Referenzen über ICorProfilerCallback2::RootReferences2 bekommen. Wenn Sie die Root-Referenzinformationen kombinieren mit ICorProfilerCallback::ObjectReferences , können Sie sich die komplette Objektreferenzgraphen für Ihre .NET-Anwendung.

Sie können mehr Echtzeit-Informationen erhalten, indem die Verwendung von ICorProfilerCallback::ObjectAllocated Rückruf um zu bestimmen, wenn einzelne CLR-Objekte erstellt bekommen. Dies kann teuer sein, obwohl, da Sie mindestens einen zusätzlichen Funktionsaufruf für jedes Objekt zugewiesen sind entstehen. Sie können durch die Abbildung des CLR-zugewiesen ObjectID auf Ihre eigene interne ID einzelne Objekte verfolgen. Ein ObjectID für ein bestimmtes Objekt ist ein ephemere Zeiger, da es als Garbage Collection ändern kann passieren, welche Objekte zu bewegen während der Verdichtung führen kann. Dieser Prozess wird dargestellt hier . Sie können die Informationen verwenden, um von ICorProfilerCallback::MovedReferences bewegten Objekten zu verfolgen.

Um die Rückrufe oben erwähnt zu aktivieren, müssen Sie die CLR Profilierungs API sagen, dass Sie an ihnen interessiert sind. Sie können dies tun, indem COR_PRF_MONITOR_GC und COR_PRF_MONITOR_OBJECT_ALLOCATED als Teil Ihrer Ereignisflags angeben, wenn Aufruf ICorProfilingInfo::SetEventMask .

David Broman ist der Entwickler auf den CLR-Profiler und seinem Blog im allgemeinen auf Profilierungs Tonnen große Informationen, darunter alle verrückten Gefahren und Probleme, die Sie vielleicht in ausführen.

Andere Tipps

Profilometer wie ANTS verwenden, um eine „Profilierungs API“, präsentiert von der CLR selbst, die ganz einfach können Sie sagen, was in der CLR geht. Zum Beispiel gibt es ein API-Rückrufverfahren, die auftreten, wenn ein Objekt zugeordnet wird, treffend ObjectAllocated () . Ebenso gibt es Veranstaltungen für wenn Methoden eingegeben werden, wenn Threads erstellt, etc etc.

Der ursprüngliche Profilerstellungs-API wird ICorProfilerCallback genannt. Spätere Versionen werden CoreProfilerCallback2 und CoreProfilerCallback3 genannt. Wenn Sie diese Namen google finden Sie genau die Antworten, die Sie suchen. Auf Codeproject können Sie ein praktisches Beispiel sehen: einer benutzerdefinierten .NET Profiler Erstellen

Eine letzte Anmerkung: Die API kann nicht aus verwaltetem Code wie C # und VB.NET verwendet werden. Es ist nur von nicht verwalteten Code wie z.B. C oder C ++. So ein C # app diese API nicht sein eigenes Verhalten und Objekte zu untersuchen, zum Beispiel verwenden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top