IntelliTrace не работает должным образом после использования "ngen install ... / profile" - PullRequest
1 голос
/ 30 ноября 2011

Мы разрабатываем приложение, которое значительно выигрывает от профилированных собственных образов .NET Framework.В связи с этим во время нашей установки мы выполняем следующие действия на нескольких сборках .NET:

ngen install "ASSEMBLY NAME" /Profile

Вскоре после развертывания нашего приложения мы получили жалобу на то, что пользователиФункция IntelliTrace в Visual Studio 2010 перестала работать.После непродолжительного расследования мы обнаружили, что, как только появляется Собственное изображение профилирования из mscorlib.dll , IntelliTrace перестает работать.Кроме того, когда это происходит, в средстве просмотра событий появляется следующее сообщение:

Профилировщик TraceLog обнаружил сборку NGEN / профиля, загруженную в процесс.Такие сборки не поддерживаются.Сбор будет отключен.

Это особенно беспокоит, так как mscorlib.dll является зависимостью от любой другой сборки .NET, что означает, что использование ngen install ... /profile в любой сборке приводит к тому, что mscorlib.dll генерируется какхорошо.

Ниже приведено простое воспроизведение проблемы:

  1. Создайте новое консольное приложение, установите его целевую платформу на .NET 2. Добавьте код, как показано визображение и установить точку останова после SomeFunction.Sample code

  2. Установите IntelliTrace на «События IntelliTrace и информация о вызовах»

  3. Начните отладку.После достижения точки останова вы должны получить следующее: correctIntelliTrace: Correct IntelliTrace

  4. Остановите отладку и выйдите из Visual Studio.

  5. Откройте новый cmd.exe врасширенный режим
  6. Выполнить: %windir%\Microsoft.NET\Framework\v2.0.50727\ngen install "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /Profile
  7. Снова запустить Visual Studio и начать отладку.Будет достигнута та же точка останова.Однако на этот раз IntelliTrace будет выглядеть следующим образом: Broken IntelliTrace
  8. Чтобы снова запустить 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.

Вопросы

  1. Есть ли способв NGEN удалить mscorlib / profile, даже если установлены другие сборки ngen / profile?
  2. Есть ли обходной путь для правильной работы IntelliTrace после выполнения NGen / Profile?
  3. Почему нетфлаг / NoDependencies работает как положено?

Спасибо, Виталий Белман

Ответы [ 2 ]

2 голосов
/ 02 мая 2012

Хорошо, у меня есть похожая проблема с OpenCover , и способ исправить это, мне сказали, это

ngen uninstall "assembly details" /Profile 

IntelliTrace, вероятно, пытается использовать библиотеки для выполнения трассировки, но не может этого сделать, поскольку не получит события JITCompilationStarted , если они не переопределяют событие JITCachedFunctionSearchStarted .

Лучше всего просто удалить сборку сценария / Profile на компьютере разработчика.

Я знаю, что я повторил то, что вы знаете, но я надеюсь, что дал ответ о том, почему это происходит, но это, вероятно, вы не можете решить самостоятельно.

0 голосов
/ 24 июля 2017
  1. Есть ли способ удаления NGEN mscorlib / profile, даже если установлены другие сборки ngen / profile?

Вы можете напрямую удалить собственные изображения для mscorlib, удалив / переименовав папку NIC mscorlib. Например, для 64-разрядной .NET 4.0 расположение папки:

c:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib

...