Будет ли когда-либо профилировщик CLR загружать собственные изображения, которые не оптимизированы для профиля?
Будет ли когда-либо профилировщик CLR загружать собственные изображения, которые не оптимизированы для профиля (то есть были скомпилированы с ngen.exe
без /profile
вариант)? Если да, то на каких условиях?
Я немного исследовал, и кажется, что ответ "да, будет", но что-то не складывается, и я не могу получить простое непрофильное собственное изображение для загрузки, когда CLR работает с профилированием,
Я запутался, так как:
С одной стороны, установка
COR_PRF_USE_PROFILE_IMAGES
Флаг события монитора может быть использован для того, чтобы заставить профилировщик искать только изображения профиля ( здесь, здесь), и если он не найдет их, вообще не будет загружать изображения - что, если я правильно понимаю, означает, что если этот флаг не установлен, CLR будет искать простые нативные изображения по умолчанию (и вернется к JIT, если не найден).С другой стороны, кажется (по крайней мере, в моей среде), что непрофильные изображения не будут загружены в любом случае, так как встроенный механизм связывания изображений будет жаловаться на несоответствие - изображение без профиля, но CLR работает с профилированием (как также описано в этом сообщении в блоге, пункт 3, но с другой стороны - изображение профиля используется, но профилировщик не указан).
Простой тест показывает, что при попытке запустить HelloWorld.exe
это был NGEN'd с ngen.exe install HelloWorld.exe
, с включенным профилировщиком, журнал привязки сборки (ExplicitBind!FileName=(HelloWorld.exe).HTM
) показывает:
Операция прошла успешно.
Результат привязки: hr = 0x0. Операция завершилась успешно.Менеджер сборки загружен из: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll, работающего под исполняемым файлом d: \ work \ dotnet \ projects \ HelloWorld \ HelloWorld \ bin \ x64 \ Debug \ HelloWorld.exe
--- Подробный журнал ошибок следует.WRN: Собственные параметры компиляции изображения не соответствуют запросу. Ищем следующий родной образ.
Но при работе с изображением профиля NGEN'd с ngen.exe install HelloWorld.exe /Profile
, изображение успешно загружено, и вывод связывателя сборки:
LOG: начать проверку всех зависимостей.
LOG: [Уровень 1] Начать проверку собственной зависимости изображения mscorlib, Версия =4.0.0.0, Культура = нейтральная, PublicKeyToken=b77a5c561934e089. Нативное изображение имеет правильную информацию о версии.
LOG: проверка зависимостей выполнена успешно.
LOG: привязка к исходному изображению успешно завершена.
Попытка использовать собственный образ C:\WINDOWS\assembly\NativeImages_v4.0.30319_64\HelloWorld\5647de1868c93e9132a1952a34e0a785\HelloWorld.ni.exe.
Родное изображение успешно использовано.
Между каждым шагом нген я убрал c:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib
для всех изображений согласовать используемые настройки (нет никаких дополнительных зависимостей HelloWorld.exe
).
Любая помощь / советы очень ценятся!
PS Я использую.NET 4.0, поэтому не имею доступа к COR_PRF_DISABLE_ALL_NGEN_IMAGES
, который, как говорят, вообще отключает нативные изображения (этот пост в блоге от Дэвида Бромана подразумевает, что этот флаг отключает все виды изображений, а это означает, что во время профилирования CLR могут использоваться как обычные, так и оптимизированные профили).
1 ответ
Возвращаясь, чтобы ответить на мой собственный вопрос: да, нативные изображения, которые не оптимизированы для профиля, будут загружены, учитывая, что COR_PRF_USE_PROFILE_IMAGES
флаг не установлен в маске событий профилировщика.
Источником моего потребления было неверное прочтение выводов журнала FUSLOGVW. В частности, как-то я упустил, чтобы увидеть, что WRN: Native image compile options do not match request. Looking for next native image
был дан для /profile
изображение, но поиск изображения продолжился и нашел простое непрофильное изображение, и успешно.
В конечном итоге мне помогло понимание того, что при отладке профилировщика в Visual Studio привязка собственных изображений отображается в окне "Вывод отладки", где также отображаются загружаемые библиотеки DLL, например:
'CSharpTestProgram.exe' (Win32): загружен 'C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\2ef49acbb43c068f6ddf1587283b5f29\mscorlib.ni.dll'.
Как только я получил это, журналы FUSLOGVW стали более понятными для меня, и я смог точно понять, какое изображение загружено и когда.
Другое наблюдение состояло в том, что mscorlib /profile
изображение занимает больше места на диске, чем обычное собственное изображение (в моем случае это на 30% больше) - это также помогло соотнести путь к изображению и его /profile
или нет.
Надеюсь, это кому-нибудь поможет.