Objektüberprüfung in der Profilerstellungs-API
In diesem Thema wird erläutert, wie Sie Profilerstellungsmethoden zum Überprüfen von Objekten verwenden.
FunctionEnter2- und FunctionLeave2-Rückrufe
Der FunctionEnter2-Rückruf und der FunctionLeave2-Rückruf bieten Informationen über die Argumente und geben den Wert einer Funktion als Speicherbereich zurück. Die Argumente werden in den entsprechenden Speicherbereichen von links nach rechts gespeichert. Ein Profiler kann die Metadatensignatur der Funktion zum Interpretieren der Argumente verwenden, wie in der folgenden Tabelle dargestellt.
ELEMENT_TYPE |
Darstellung |
---|---|
Primitive (ELEMENT_TYPE <= R8, I, U) |
Primitive Werte. |
Werttypen (VALUETYPE) |
Hängt vom Typ ab. |
Referenztypen (CLASS, STRING, OBJECT, ARRAY, GENERICINST, SZARRAY) |
ObjectID (Zeiger in einen Garbage Collection-Heap). |
BYREF |
Verwalteter Zeiger (keine ObjectID, kann jedoch auf einen Stapel oder einen Garbage Collection-Heap verweisen). |
PTR |
Nicht verwalteter Zeiger (nicht durch die Garbage Collection verschiebbar). |
FNPTR |
Nicht transparenter Wert in Zeigergröße. |
TYPEDBYREF |
Verwalteter Zeiger, gefolgt von einem nicht transparenten Wert in Zeigergröße. |
Der Unterschied zwischen einer ObjectID und einem verwalteten Zeiger ist der folgende:
ObjectIDs verweisen nur auf den Garbage Collection-Heap oder den Heap fixierter Objekte. Verwaltete Zeiger können auch auf den Stapel verweisen.
ObjectIDs verweisen immer auf den Anfang eines Objekts. Verwaltete Zeiger können auch auf eines der Objektfelder verweisen.
Verwaltete Zeiger können nicht an Funktionen übergeben werden, die eine ObjectID erwarten.
Eine Liste der verfügbaren CLR-Typen finden Sie in der CorElementType-Enumeration.
Überprüfen komplexer Typen
Das Überprüfen von Referenztypen oder nicht primitiven Werttypen setzt einige erweiterte Verfahren voraus.
Für Werttypen und Referenztypen, die keine Zeichenfolgen oder Arrays sind, bietet die ICorProfilerInfo2::GetClassLayout-Methode den Offset für die einzelnen Felder. Anhand der Metadaten kann der Profiler dann den Feldtyp ermitteln und ihn rekursiv auswerten.
Hinweis |
---|
GetClassLayout gibt nur die Felder zurück, die von der Klasse selbst definiert werden; von der übergeordneten Klasse definierte Felder sind nicht eingeschlossen.Mit der ICorProfilerInfo2::GetClassIDInfo2-Methode können Sie die ClassID der übergeordneten Klasse ermitteln und dann GetClassLayout zum Abrufen der Informationen über die von der übergeordneten Klasse definierten Felder verwenden. |
Für geschachtelte Werttypen stellt die ICorProfilerInfo2::GetBoxClassLayout-Methode den Offset des Werttyps innerhalb des Felds bereit. Das Layout des Werttyps selbst ändert sich nicht. Daher kann der Profiler GetClassLayout zum Interpretieren des Layouts verwenden, sobald er den Werttyp im Feld ermittelt hat.
Für Zeichenfolgen stellt die ICorProfilerInfo2::GetStringLayout-Methode die Offsets relevanter Datenteile im Zeichenfolgenobjekt bereit.
Arrays bilden hierbei eine gewisse Ausnahme, da Sie eine Methode für die einzelnen Arrayobjekte und nicht jeden Arraytyp aufrufen müssen. (Das liegt daran, dass es zu viele Arrayformate gibt, die nicht alle durch Offsets beschrieben werden können.) Zum Durchführen der Interpretation steht die ICorProfilerInfo2::GetArrayObjectInfo-Methode zur Verfügung.
Überprüfen statischer Felder
Es gibt vier Typen von statischen Feldern. In der folgenden Tabelle ist aufgeführt, was diese Felder sind und wie Sie sie erkennen können.
Statischer Typ |
Definition |
Wie in den Metadaten angezeigt |
---|---|---|
AppDomain |
Ein grundlegendes statisches Feld. Es verfügt in jeder Anwendungsdomäne über einen anderen Wert. |
Statisches Feld, das über keine angefügten benutzerdefinierten Attribute verfügt. |
Thread |
Verwalteter lokaler Threadspeicher (TLS) Dies ist ein statisches Feld mit einem eindeutigen Wert für jeden Thread und jede Anwendungsdomäne. |
Mit ThreadStaticAttribute markiertes statisches Feld. |
RVA |
Durch einen Prozess bewertetes statisches Feld mit Speicherort im Datenabschnitt des Moduls. |
Statisches Feld mit hasRVA-Flag. |
Kontext |
Statisches Feld mit einem anderen Wert in jedem COM+-Kontext. |
Mit ContextStaticAttribute markiertes statisches Feld. |
Die Methoden ICorProfilerInfo2::GetThreadStaticAddress, ICorProfilerInfo2::GetAppDomainStaticAddress, ICorProfilerInfo2::GetContextStaticAddress und ICorProfilerInfo2::GetRVAStaticAddress stellen Informationen über den Speicherort von statischen Feldern bereit. Unter Berücksichtigung des Speichers an diesem Speicherort können Sie dies wie folgt interpretieren:
Referenztypen: ObjectID.
Werttypen: ObjectID des Felds, das den eigentlichen Wert enthält.
Primitive Typen: Primitiver Wert.
Referenz
ICorProfilerInfo2::GetClassLayout-Methode
ICorProfilerInfo2::GetBoxClassLayout-Methode
ICorProfilerInfo2::GetStringLayout-Methode
ICorProfilerInfo2::GetArrayObjectInfo-Methode
ICorProfilerInfo2::GetThreadStaticAddress-Methode
ICorProfilerInfo2::GetAppDomainStaticAddress-Methode
ICorProfilerInfo2::GetContextStaticAddress-Methode
ICorProfilerInfo2::GetRVAStaticAddress-Methode