Поделиться через


Проверка объектов в интерфейсе API для профилирования

В этом разделе рассматривается использование методов профилирования для проверки объектов.

Обратные вызовы FunctionEnter2 и FunctionLeave2

Обратные вызовы FunctionEnter2 и FunctionLeave2 предоставляют сведения об аргументах и возвращаемом значении функции как об областях памяти. Аргументы сохраняются в заданных областях памяти слева направо. Профилировщик может использовать подпись метаданных функции для интерпретации аргументов, как показано в следующей таблице.

ELEMENT_TYPE

Представление

Примитивы (ELEMENT_TYPE <= R8, I, U)

Значения примитивов.

Типы значений (VALUETYPE)

Зависит от типа.

Ссылочные типы (CLASS, STRING, OBJECT, ARRAY, GENERICINST, SZARRAY)

ObjectID (указатель на кучу для сборки мусора).

BYREF

Управляемый указатель (не ObjectID, однако он может указывать на стек или кучу для сборки мусора).

PTR

Неуправляемый указатель (не может быть перемещен при сборке мусора).

FNPTR

Непрозрачное значение, размер которого задает указатель.

TYPEDBYREF

Управляемый указатель, за которым следует непрозрачное значение, размер которого задает указатель.

Ниже приведены отличия между параметром ObjectID и управляемым указателем.

  • Параметры ObjectID указывают только на кучу для сборки мусора или кучу замороженных объектов. Управляемые указатели могут также указывать на стек.

  • Параметры ObjectID всегда указывают на отладку объекта. Управляемые указатели могут указывать на одно из полей объекта.

  • Управляемые указатели нельзя передать функции, которая должна получить параметр ObjectID.

Список доступных типов среды CLR см. в описании перечисления CorElementType.

Проверка составных типов

При проверке ссылочных типов или типов значений, не являющихся типами-примитивами, задействуется несколько прогрессивных методик.

Для типов значений и ссылочных типов, отличных от строк и массивов, метод ICorProfilerInfo2::GetClassLayout предоставляет смещение для каждого поля. Затем профилировщик может с помощью метаданных определить тип поля и выполнить для него рекурсивную оценку.

ПримечаниеПримечание

Метод GetClassLayout возвращает только поля, определенные самим классом; поля, определенные родительским классом не возвращаются.Воспользовавшись методом ICorProfilerInfo2::GetClassIDInfo2, можно найти значение ClassID родительского класса, а затем воспользоваться методом GetClassLayout для получения сведений о полях, заданных родительским классом.

Для упакованных типов значений метод ICorProfilerInfo2::GetBoxClassLayout предоставляет смещение типа значения в пределах упаковки. Структура самого типа значения остается неизменной. Поэтому, как только профилировщик обнаруживает тип значения в пределах упаковки, он может воспользоваться методом GetClassLayout для анализа его структуры.

Для строк метод ICorProfilerInfo2::GetStringLayout предоставляет смещения интересующих частей данных в строковом объекте.

Массивы — это особый случай, поскольку метод нужно вызывать для каждого объекта массива, а не для каждого его типа. (Это является следствием наличия слишком большого количества форматов массивов, чтобы их можно было описать с помощью смещений.) Метод ICorProfilerInfo2::GetArrayObjectInfo предоставлен для интерпретирования.

Проверка статических полей

Существует четыре типа статических полей. В следующей таблице описывает их предназначение и способы идентификации.

Статический тип

Определение

Представление в метаданных

AppDomain

Базовое статическое поле. Он обладает различными значениями в каждом домене приложений.

Статическое поле без вложенных настраиваемых атрибутов.

Поток

Управляемое хранилище TLS. Статическое поле с уникальным значением для каждого потока и каждого домена приложения.

Статическое поле, отмеченное атрибутом ThreadStaticAttribute.

RVA

Ограничивающееся процессом статическое поле, которое располагается в разделе данных модуля.

Статическое поле с флагом hasRVA.

Контекст

Статическое поле с различными значениями в каждом контексте COM+.

Статическое поле, отмеченное атрибутом ContextStaticAttribute.

Методы ICorProfilerInfo2::GetThreadStaticAddress, ICorProfilerInfo2::GetAppDomainStaticAddress, ICorProfilerInfo2::GetContextStaticAddress и ICorProfilerInfo2::GetRVAStaticAddress предоставляют сведения о расположении статических полей. Эти расположения в памяти следует интерпретировать следующим образом.

  • Ссылочные типы: ObjectID.

  • Типы значений: параметр ObjectID упаковки, в которой содержится фактическое значение.

  • Типы-примитивы: значение примитива.

Ссылки

Функция FunctionEnter2

Функция FunctionLeave2

Метод ICorProfilerInfo2::GetClassLayout

Метод ICorProfilerInfo2::GetBoxClassLayout

Метод ICorProfilerInfo2::GetStringLayout

Метод ICorProfilerInfo2::GetArrayObjectInfo

Метод ICorProfilerInfo2::GetThreadStaticAddress

Метод ICorProfilerInfo2::GetAppDomainStaticAddress

Метод ICorProfilerInfo2::GetContextStaticAddress

Метод ICorProfilerInfo2::GetRVAStaticAddress

См. также

Основные понятия

Общие сведения о профилировании