Бөлісу құралы:


Настройка среды профилирования

Замечание

В .NET Framework 4 были существенные изменения в профилировании.

При запуске управляемого процесса (приложения или службы) она загружает среду CLR. При инициализации среды CLR оценивает следующие две переменные среды, чтобы определить, должен ли процесс подключаться к профилировщику:

  • COR_ENABLE_PROFILING. СРЕДА CLR подключается к профилировщику только в том случае, если эта переменная среды существует и имеет значение 1.

  • COR_PROFILER. Если проверка COR_ENABLE_PROFILING проходит, среда CLR подключается к профилировщику с данным CLSID или ProgID, который должен храниться ранее в реестре. Переменная среды COR_PROFILER определена как строка, как показано в следующих двух примерах.

    set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A}
    set COR_PROFILER="MyProfiler"
    

Чтобы профилировать приложение CLR, перед запуском приложения необходимо задать COR_ENABLE_PROFILING и COR_PROFILER переменные среды. Необходимо также убедиться, что библиотека DLL профилировщика зарегистрирована.

Замечание

Начиная с .NET Framework 4, профилировщики не должны быть зарегистрированы.

Замечание

Чтобы использовать профилировщики .NET Framework версии 2.0, 3.0 и 3.5 в .NET Framework 4 и более поздних версиях, необходимо задать переменную среды COMPLUS_ProfAPI_ProfilerCompatibilitySetting.

Область переменной среды

Настройка COR_ENABLE_PROFILING и COR_PROFILER переменных среды определяет их область влияния. Эти переменные можно задать одним из следующих способов:

  • Если вы задаете переменные в вызове ICorDebug::CreateProcess , они будут применяться только к приложению, которое выполняется в то время. (Они также будут применяться к другим приложениям, запущенным этим приложением, наследующим среду.)

  • Если вы задаете переменные в окне командной строки, они будут применяться ко всем приложениям, запущенным из этого окна.

  • Если вы задаете переменные на уровне пользователя, они будут применяться ко всем приложениям, начинающимся с проводника. Окно командной строки, которое открывается после задания переменных, будет иметь эти параметры среды, поэтому любое приложение, которое запускается из этого окна. Чтобы задать переменные среды на уровне пользователя, щелкните правой кнопкой мыши "Мой компьютер", щелкните вкладку "Дополнительно", выберите "Переменные среды" и добавьте переменные в список переменных пользователя.

  • Если переменные заданы на уровне компьютера, они будут применяться ко всем приложениям, запущенным на этом компьютере. Откроется окно командной строки, которое откроется на этом компьютере, будет иметь эти параметры среды, поэтому любое приложение, которое вы начинаете с этого окна. Это означает, что каждый управляемый процесс на этом компьютере начнется с профилировщика. Чтобы задать переменные среды на уровне компьютера, щелкните правой кнопкой мыши "Мой компьютер", щелкните вкладку "Дополнительно", выберите "Переменные среды", добавьте переменные в список системных переменных и перезагрузите компьютер. После перезапуска переменные будут доступны на уровне системы.

Если вы профилируете службу Windows, необходимо перезапустить компьютер после установки переменных среды и регистрации библиотеки DLL профилировщика. Дополнительные сведения об этих рекомендациях см. в разделе "Профилирование службы Windows".

Дополнительные рекомендации

  • Класс профилировщика реализует интерфейсы ICorProfilerCallback и ICorProfilerCallback2 . В .NET Framework версии 2.0 профилировщик должен реализовать ICorProfilerCallback2. Если это не так, ICorProfilerCallback2 не будет загружена.

  • Только один профилировщик может профилирование процесса одновременно в заданной среде. Вы можете зарегистрировать два разных профилировщика в разных средах, но каждый из них должен профилировать отдельные процессы. Профилировщик должен быть реализован в виде библиотеки DLL-файла COM-сервера, сопоставленной с тем же адресным пространством, что и профилируемый процесс. Это означает, что профилировщик выполняется в процессе. Платформа .NET Framework не поддерживает какой-либо другой тип COM-сервера. Например, если профилировщик хочет отслеживать приложения с удаленного компьютера, он должен реализовать агенты сборщика на каждом компьютере. Эти агенты будут пакетировать результаты и обмениваться данными с центральным компьютером сбора данных.

  • Так как профилировщик является com-объектом, который создается в процессе, каждое профилированное приложение будет иметь собственную копию профилировщика. Поэтому одному экземпляру профилировщика не нужно обрабатывать данные из нескольких приложений. Однако необходимо добавить логику в код ведения журнала профилировщика, чтобы предотвратить перезаписи файлов журнала из других профилированных приложений.

Инициализация профилировщика

При прохождении обеих переменных среды среда CLR создает экземпляр профилировщика аналогично функции COM CoCreateInstance . Профилировщик не загружается через прямой вызов CoCreateInstance. Поэтому вызов CoInitialize, в который требуется задать модель потоков, избегается. Затем среда CLR вызывает метод ICorProfilerCallback::Initialize в профилировщике. Сигнатура этого метода выглядит следующим образом.

HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)

Профилировщик должен запросить pICorProfilerInfoUnk указатель интерфейса ICorProfilerInfo или ICorProfilerInfo2 и сохранить его, чтобы получить дополнительные сведения позже во время профилирования.

Настройка уведомлений о событиях

Затем профилировщик вызывает метод ICorProfilerInfo::SetEventMask , чтобы указать, какие категории уведомлений он интересует. Например, если профилировщик заинтересован только в вводе и выходе уведомлений и уведомлений сборки мусора, он указывает следующее.

ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)

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

Некоторые события профилировщика неизменяемы. Это означает, что после установки этих событий в обратном ICorProfilerCallback::Initialize вызове их нельзя отключить и включить новые события. Попытки изменить неизменяемое событие приведет к ICorProfilerInfo::SetEventMask возврату неисправного HRESULT.

Профилирование службы Windows

Профилирование службы Windows похоже на профилирование приложения среды CLR. Обе операции профилирования включены с помощью переменных среды. Так как служба Windows запускается при запуске операционной системы, переменные среды, рассмотренные ранее в этом разделе, должны присутствовать и задавать необходимые значения перед запуском системы. Кроме того, библиотека DLL профилирования должна быть уже зарегистрирована в системе.

После настройки переменных среды COR_ENABLE_PROFILING и COR_PROFILER среды и регистрации библиотеки DLL профилировщика необходимо перезапустить целевой компьютер, чтобы служба Windows может обнаружить эти изменения.

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

Этот метод также приводит к профилирование каждого процесса CLR. Профилировщик должен добавить логику в свой ICorProfilerCallback::Initialize callback, чтобы определить, интересен ли текущий процесс. В противном случае профилировщик может завершить обратный вызов без инициализации.

См. также