IntelliTrace не работает должным образом после использования "ngen install ... /profile"
Мы разрабатываем приложение, которое значительно выигрывает от профилированных собственных образов.NET Framework. В связи с этим во время нашей установки мы запускаем следующее на нескольких сборках.NET:
ngen install "ASSEMBLY NAME" /Profile
Вскоре после развертывания нашего приложения мы получили жалобу о том, что пользовательская функция IntelliTrace в Visual Studio 2010 перестала работать. После непродолжительного расследования мы обнаружили, что как только появляется профилирующий собственный образ mscorlib.dll, IntelliTrace перестает работать. Также, когда это происходит, мы получаем следующее сообщение в Event Viewer:
Профилировщик TraceLog обнаружил сборку NGEN / профиля, загруженную в процесс. Такие сборки не поддерживаются. Коллекция будет отключена.
Это особенно беспокоит, так как mscorlib.dll является зависимостью любой другой сборки.NET, что означает, что использование ngen install ... /profile
на любой сборке вызывает генерацию mscorlib.dll.
Ниже приводится простое воспроизведение вопроса:
Создайте новое консольное приложение, установите для его целевой платформы значение.NET 2. Добавьте код, как показано на рисунке, и установите точку останова после SomeFunction.
Установите IntelliTrace на "События IntelliTrace и информация о вызовах"
Начните отладку. Как только достигнута точка останова, вы должны получить следующее: correctIntelliTrace:
Остановите отладку и выйдите из Visual Studio.
- Откройте новый cmd.exe в режиме повышенных прав
- Выполнение:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
- Снова запустите Visual Studio и начните отладку. Будет достигнута та же точка останова. Однако на этот раз IntelliTrace будет выглядеть следующим образом:
- Чтобы снова запустить IntelliTrace в том же окне cmd:
%windir%\Microsoft.NET\Framework\v2.0.50727\ngen uninstall "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
Мы также пытались использовать /NoDependencies флаг ngen.exe, чтобы добавить только определенные сборки, без mscorlib, однако, кажется, что этот флаг игнорируется - даже если мы выполнили ngen install ... /Profile /NoDependencies
, зависимости установлены: Бег ngen display | find "<profiling>"
показывает, что mscorlib все еще установлен, хотя был использован флаг /NoDependencies.
Вопросы
- Есть ли способ удалить NGEN mscorlib /profile, даже если установлены другие сборки ngen /profile?
- Есть ли обходной путь для правильной работы IntelliTrace после выполнения NGen /Profile?
- Почему флаг /NoDependencies не работает должным образом?
Спасибо, Виталий Бельман
2 ответа
Хорошо, у меня есть похожая проблема с OpenCover и способ исправить это, мне сказали,
ngen uninstall "assembly details" /Profile
IntelliTrace, вероятно, пытается использовать библиотеки для выполнения трассировки, но не может этого сделать, поскольку не получит события JITCompilationStarted, если они не переопределяют событие JITCachedFunctionSearchStarted.
Лучше всего просто удалить сборку сценария /Profile на компьютере разработчика.
Я знаю, что я повторил то, что вы знаете, но я надеюсь, что дал ответ о том, почему это происходит, но это, вероятно, не то, что вы можете решить самостоятельно.
- Есть ли способ удалить NGEN mscorlib /profile, даже если установлены другие сборки ngen /profile?
Вы можете напрямую удалить собственные изображения для mscorlib, удалив / переименовав папку NIC mscorlib. Например, для 64-разрядной версии.NET 4.0 расположение папки:
c:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib