Почему простые, неоптимизированные по профилю нативные изображения не загружаются моим профилировщиком CLR?

Я разрабатываю профилировщик CLR, используя интерфейсы профилирования CLR, и мне трудно заставить CLR загружать простые, неоптимизированные для профиля нативные образы (которые были скомпилированы с ngen.exe без параметра /profile) при запуске моего профилировщика (или, по крайней мере, кажется, что такие картинки не грузятся, но пока точно сказать не могу). Что я делаю не так?

Я проверил, что COR_PRF_USE_PROFILE_IMAGES флаг (который разрешает только собственные изображения, оптимизированные для профиля) не установлен в моем профилировщике.

Ниже то, что я пробовал. Любая помощь/советы очень ценятся!

Выводы FUSLOGVW:

Я проверял собственные журналы связывания изображений (в FUSLOGVW.exe), пытаясь выяснить, загружены ли изображения или нет:

  • При запуске HelloWorld.exe с «простым» собственным образом — который был NGEN'd с ngen.exe install HelloWorld.exe с включенным профилировщиком — журнал связывания сборки (ExplicitBind!FileName=(HelloWorld.exe).HTM) показывает:

    Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
    Running under executable  d:\work\dotnet\projects\HelloWorld\HelloWorld\bin\x64\Debug\HelloWorld.exe  
    --- A detailed error log follows. 
    
    WRN: Native image compile options do not match request. Looking for next native image.
    

    Итак, судя по этому предупреждению, родное изображение не было загружено.

  • При работе с изображением профиля, NGEN'd с ngen.exe install HelloWorld.exe /Profile, кажется, что изображение успешно загружено, и выходные данные связывателя сборки:

    LOG: Start validating all the dependencies.  
    LOG: [Level 1]Start validating native image dependency mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
    Native image has correct version information.  
    LOG: Validation of dependencies succeeded.  
    LOG: Bind to native image succeeded.  
    Attempting to use native image C:\WINDOWS\assembly\NativeImages_v4.0.30319_64\HelloWorld\5647de1868c93e9132a1952a34e0a785\HelloWorld.ni.exe.  
    Native image successfully used.
    

    Итак, кажется, что на этот раз изображение было загружено.

  • Просто для уверенности между каждым шагом ngen я удалял c:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib для всех изображений, чтобы согласовать используемые настройки (дополнительных зависимостей от HelloWorld.exe нет).

Дополнительная информация:

  • Я использую .NET 4.0, поэтому у меня нет доступа к COR_PRF_DISABLE_ALL_NGEN_IMAGES, который полностью отключает собственные изображения (описано в этом запись в блоге от Дэвида Бромана). Это могло быть полезно для устранения неполадок.

person valiano    schedule 23.07.2017    source источник


Ответы (1)


Возвращаясь к ответу на мой собственный вопрос, кажется, что нативные изображения действительно были загружены! (оба вида - гладкие и профильные оптимизированные). Проблема заключалась в том, что я понял, что это действительно так.

Источником моего заблуждения было неправильное прочтение выходных данных журнала FUSLOGVW. В частности, я как-то пропустил, чтобы увидеть, что WRN: Native image compile options do not match request. Looking for next native image было указано для изображения /profile, но поиск изображения продолжился и нашел простое, непрофильное изображение, и увенчался успехом.

В конечном итоге моему пониманию помогла Visual Studio. При отладке профилировщика CLR в Visual Studio привязка собственных образов отображалась в окне Вывод отладки, где также отображались загружаемые библиотеки DLL:

'CSharpTestProgram.exe' (Win32): Loaded 'C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\2ef49acbb43c068f6ddf1587283b5f29\mscorlib.ni.dll'. 

Visual Studio — Вывод — Исходное изображение

Как только я получил это, журналы FUSLOGVW стали более понятными, и я мог точно понять, какое изображение загружается и когда.

Другое наблюдение заключалось в том, что образ mscorlib /profile занимает больше места на диске, чем обычный собственный образ (в моем случае на 30% больше), что также помогло мне сопоставить путь к образу и является ли он /profile или нет.

person valiano    schedule 04.09.2017