Verifica degli oggetti nell'API di profilatura

In questo argomento viene illustrato l'utilizzo dei metodi di profilatura per l'analisi degli oggetti.

Callback di FunctionEnter2 e FunctionLeave2

I callback delle funzioni FunctionEnter2 e FunctionLeave2 forniscono informazioni sugli argomenti e il valore restituito di una funzione, ad esempio le aree di memoria. Gli argomenti vengono archiviati da sinistra verso destra nelle aree di memoria specificate. Un profiler può utilizzare la firma dei metadati della funzione per interpretare gli argomenti, come mostrato nella tabella riportata di seguito.

ELEMENT_TYPE

Rappresentazione

Primitivi (ELEMENT_TYPE < = R8, I, U)

Valori primitivi.

Tipi valore (VALUETYPE)

Dipendente dal tipo.

Tipi riferimento (CLASS, STRING, OBJECT, ARRAY, GENERICINST, SZARRAY)

ObjectID (puntatore in un heap di Garbage Collection).

BYREF

Puntatore gestito (non si tratta di un oggetto ObjectID, ma è probabile che punti a uno stack o a un heap di Garbage Collection).

PTR

Puntatore non gestito (non è possibile spostarlo utilizzando Garbage Collection).

FNPTR

Valore nascosto della dimensione del puntatore.

TYPEDBYREF

Puntatore gestito, seguito da un valore nascosto della dimensione del puntatore.

Le differenze tra un oggetto ObjectID e un puntatore gestito sono indicate di seguito:

  • Gli oggetti ObjectID puntano solo nell'heap del Garbage Collection o di oggetti bloccati. I puntatori gestiti possono puntare anche allo stack.

  • Gli oggetti ObjectID puntano sempre all'inizio di un oggetto. I puntatori gestiti possono puntare a uno dei campi dell'oggetto.

  • È impossibile passare i puntatori gestiti a funzioni per le quali è previsto un oggetto ObjectID.

Per un elenco dei tipi di CLR disponibili, vedere l'enumerazione CorElementType.

Verifica dei tipi complessi

La verifica dei tipi riferimento o dei tipi valore non primitivi implica alcune tecniche avanzate.

Per i tipi valore e tipi riferimento diversi da stringhe o matrici, il metodo ICorProfilerInfo2::GetClassLayout fornisce l'offset per ogni campo. Il profiler può utilizzare quindi i metadati per determinare il tipo del campo e valutarlo in modo ricorsivo.

Nota

L'oggetto GetClassLayout restituisce solo i campi definiti dalla classe stessa. I campi definiti dalla classe padre non sono inclusi.È possibile utilizzare il metodo ICorProfilerInfo2::GetClassIDInfo2 per cercare il ClassID della classe padre e quindi utilizzare il metodo GetClassLayout per ottenere informazioni sui campi definiti dalla classe padre.

Per i tipi valore boxed, il metodo ICorProfilerInfo2::GetBoxClassLayout fornisce l'offset del tipo valore all'interno della casella. Il layout del tipo valore non viene modificato. Pertanto, appena il profiler rileva il tipo di valore all'interno della casella, può utilizzare l'oggetto GetClassLayout per individuare il layout.

Per le stringhe, il metodo ICorProfilerInfo2::GetStringLayout fornisce gli offset di dati significativi nell'oggetto stringa.

Le matrici sono piuttosto singolari, in quanto è necessario chiamare un metodo per ogni oggetto matrice anziché per ogni tipo di matrice. Questa particolarità è dovuta al numero eccessivo di formati delle matrici da descrivere mediante gli offset. Il metodo ICorProfilerInfo2::GetArrayObjectInfo consente di elaborare l'interpretazione.

Verifica dei campi statici

Esistono quattro tipi di campi statici. Nella tabella riportata di seguito è inclusa una definizione di questi campi e il metodo per identificarli.

Tipo statico

Definizione

Modalità di visualizzazione nei metadati

AppDomain

Campo statico di base. Ha un valore diverso per ogni dominio dell'applicazione.

Campo statico senza attributi personalizzati associati.

Thread

Archiviazione locale del thread gestita. Si tratta di un campo statico con un valore univoco per ogni thread e per ogni dominio dell'applicazione.

Campo statico contrassegnato con ThreadStaticAttribute.

RVA

Campo statico con ambito del processo con origine nella sezione dei dati del modulo.

Campo statico con flag hasRVA.

Contesto

Campo statico con un valore diverso per ogni contesto COM+.

Campo statico contrassegnato con ContextStaticAttribute.

I metodi ICorProfilerInfo2::GetThreadStaticAddress, ICorProfilerInfo2::GetAppDomainStaticAddress, ICorProfilerInfo2::GetContextStaticAddresse ICorProfilerInfo2::GetRVAStaticAddress forniscono informazioni sulla posizione dei campi statici. Esaminando la memoria in quella posizione, è possibile fornire la seguente interpretazione:

  • Tipi riferimento: ObjectID.

  • Tipi valore: ObjectID della casella che contiene il valore effettivo.

  • Tipi primitivi: valore primitivo.

Riferimento

Funzione FunctionEnter2

Funzione FunctionLeave2

Metodo ICorProfilerInfo2::GetClassLayout

Metodo ICorProfilerInfo2::GetBoxClassLayout

Metodo ICorProfilerInfo2::GetStringLayout

Metodo ICorProfilerInfo2::GetArrayObjectInfo

Metodo ICorProfilerInfo2::GetThreadStaticAddress

Metodo ICorProfilerInfo2::GetAppDomainStaticAddress

Metodo ICorProfilerInfo2::GetContextStaticAddress

Metodo ICorProfilerInfo2::GetRVAStaticAddress

Vedere anche

Altre risorse

Cenni preliminari sulla profilatura