Установка профилирующей среды
Примечание |
---|
В .NET Framework 4 произошли существенные изменения в области профилирования.Обратитесь к разделу Профилирование в платформе .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, регистрация профилировщиков стала необязательной.Дополнительные сведения о запуске профилировщиков без из регистрации в качестве COM-компонентов см. в разделе Запуск и присоединение профилировщиков без их регистрации. |
Примечание |
---|
Для использования профилировщиков платформы .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, чтобы определить, следует выполнять операции с текущим процессом. Если нет, профилировщик может выдать сбой для обратного вызова, не выполняя инициализацию.