Подтвердить что ты не робот

Многочисленные экземпляры VBCSCompiler.exe

Недавно я загрузил и установил Visual Studio Professional 2015 (14.0.23107.0). В первый раз, когда я открыл свое решение (28 проектов) и выполнил Build → Rebuild Solution, моя машина разработки полностью обходилась. CPU был максимальным на 100%, а сборка никогда не завершалась - даже после > 10 минут.

Я открыл Диспетчер задач Windows и заметил: > 10 запущенных задач VBCSCompiler.exe. В сочетании эти задачи отправили CPU > 90%.

Любая идея, почему существует так много этих задач? Любой способ остановить это?

Это самая близкая вещь, которую я могу найти, чтобы кто-то другой столкнулся с одной и той же проблемой: https://github.com/dotnet/roslyn/issues/2790

Обновление (8/7)

-Аванс, великая мысль. Мой менеджер предоставил мне этот выпуск (14.0.23107.0). Это правильная версия для "официального релиза"? Я не сознательно установил ни одну из версий релиза Visual Studio 2015. Я не думаю, что есть какие-то бета-версии.

-Kyle Trauberman, я не знаком с переменными окружения в контексте Visual Studio; однако я наивно побежал set DisableRosyln=true в окне командной строки VS (и MSBuild). Это, похоже, не оказало никакого влияния. VBCSCompiler.exe показал правильную резервную копию даже после перезапуска VS2015.

Я восстановил установку VS2015 и выполнил перезагрузку. Это не помогло.

Обновить часть 2 (8/7) -Харанс, очень впечатляюще писать! Хотя на этот раз проблема не произошла, я взглянул на то, что вы описали:

Что касается модулей, загружаемых VBCSCompiler.exe, вот что у меня есть:

введите описание изображения здесь

Интересно, что наши сборки ядра .NET находятся в разных версиях. Вы на 4.06.79, а я на 4.06.81.

Мои "клиентские DLL файлы" (расположенные в папке C:\Program Files (x86)\MSBuild\14.0\Bin\Microsoft.Build.Tasks.CodeAnalysis.dll) имеют ту же версию и метку времени, что и ваши: введите описание изображения здесь

Как ни странно, когда я смотрю на код в ILSpy, я вижу что-то немного другое - возможно, оптимизация?

    private static NamedPipeClientStream TryAllProcesses(string pipeName, int timeoutMs, CancellationToken cancellationToken, out string newPipeName)
{
    string str = pipeName;
    int num = 1;
    while (File.Exists(string.Format("\\\\.\\pipe\\{0}", pipeName)))
    {
        NamedPipeClientStream result;
        if ((result = BuildClient.TryConnectToProcess(pipeName, timeoutMs, cancellationToken)) != null)
        {
            newPipeName = pipeName;
            return result;
        }
        pipeName = str + "." + num.ToString(CultureInfo.InvariantCulture);
        num++;
    }
    newPipeName = pipeName;
    return null;
}

** Позвольте мне вернуться с вами к конкретному аргументу pipname, переданному экземплярам VBCSCompiler.exe. Я должен буду ждать, пока это не повторится.

4b9b3361

Ответ 1

Хм, нет очевидного сценария воспроизведения, и никто больше не жалуется на это. Ваше решение не является чем-то необычным. Перестановка процессора на 100% и получение процесса VBCSCompiler для проглатывания ~ 1,5 ГБ не очень сложно для большого проекта, но он скрипучий, когда я смотрю на свою.

Первый возможный сценарий сбоя, что у вас есть некоторые удаленные бета-бит, лежащие вокруг, очень распространенная проблема. Используйте отладчик для просмотра. Используйте Debug > Attach to Process и выберите один из запущенных экземпляров. Затем Debug > Break All и Debug > View > Modules. Обратите внимание на номера версий и временные метки, они должны выглядеть так:

введите описание изображения здесь

Обратите внимание, что умышленно спрятал некоторые столбцы, чтобы они были читабельны. Временные метки являются часовым поясом КНТ.


Это серверная сторона. Клиентская сторона, у которой обнаружена ошибка, находится в папке C:\Program Files (x86)\MSBuild\14.0\Bin\Microsoft.Build.Tasks.CodeAnalysis.dll. Взгляните на его свойства, мой 85,192 байт и создан в воскресенье, 21 июня 2015 года, 7:06:54 вечера, номер версии файла 1.0.0.50618. Вы можете посмотреть файл с помощью декомпилятора, например Reflector или ILSpy, перейти к BuildClient.TryAllProcesses(). Соответствующая строка с исправлением ошибки:

for (int i = 1; File.Exists(string.Format(@"\\.\pipe\{0}", pipeName)); i++)

Ошибка в багги-версии \\.\pipe\.


Обратите внимание, что проверка ошибок очень неадекватна в приведенном выше фрагменте, File.Exists() возвращает false по многим причинам. Также основная причина, по которой ошибка не была обнаружена ранее. Это позволяет использовать несколько возможных режимов сбоев, тип которых активирован, если ваша машина заражена типичной усаженной оболочкой вредоносной программой, которую программисты добровольно устанавливают. Сервер и клиентский код соединяются друг с другом через именованный канал со специальным именем. То, что вы можете увидеть на вкладке "Диспетчер задач", "Процессы". Используйте "Вид" > "Выбор столбцов" (Win8 и вверх: щелкните правой кнопкой мыши заголовок столбца) и отметьте опцию "Командная строка": введите описание изображения здесь

Обратите внимание на аргумент -pipename. Если вызов File.Exists() возвращает false, то MSBuild снова запустит VBCSCompiler.exe. Если вы видите, что все эти экземпляры работают с тем же аргументом -pipename, то на вашем компьютере есть программное обеспечение, которое мешает нормальному использованию именованного канала. Первое, что вы подумаете, это искать менее агрессивное решение для защиты от вредоносных программ. Вы можете написать небольшую тестовую программу, которая использует пространство имен System.IO.Pipes для получения лучшего сообщения об исключении.

Ответ 2

Любая идея, почему работает так много этих задач?

Roslyn использует общий процесс компиляции, который сохраняет ваш скомпилированный код в памяти для повторного использования в последующих компиляторах. Таким образом, второй компилятор будет быстрее, но, как вы видели, накладные расходы памяти.

Как остановить это?

Да. Из здесь существует свойство компилируемой задачи в msbuild, которая отключает общий компилятор, и он устанавливает значение true default.

Итак, в каждом проекте вам нужно добавить это свойство в файл проекта. Или в Visual Studio 2015 теперь есть общие проекты, где вы можете добавить это свойство в общий проект, а затем включить этот общий проект во все другие проекты, которые нуждаются в этом параметре.

<PropertyGroup>
  <UseSharedCompilation>false</UseSharedCompilation>
</PropertyGroup>

Ответ 3

По состоянию на 22 ноября 2015 года эта проблема все еще происходила со мной в выпуске сообщества Visual Studio 2015. Мой ноутбук начал удваиваться как космический обогреватель со всеми экземплярами VBCSCompiler, работающими с полным дросселем.

Единственное исправление, которое сработало для меня, это найти файл VBCSCompiler.exe в каталоге /bin/roslyn веб-приложения и изменить разрешения безопасности на нем.

Вам нужно deny прочитать и выполнить разрешение для AppPool, в котором работает ваше веб-приложение.

введите описание изображения здесь

Ответ 4

В соответствии с Slaks вы можете отключить roslyn (что и является VBCSCompiler.exe), установив переменную среды DisableRoslyn в true.

Подробнее см. http://blog.slaks.net/2014-05-21/exploring-roslyn-part-2-inside-end-user-preview/.

Обратите внимание, что ссылка выше для предварительного просмотра, но я не могу себе представить, что она сильно изменилась между тем и сейчас.

Ответ 5

Вы также можете изменить опцию "keep alive" для VBCSCompiler, чтобы закрыть ее сразу после выполнения... Вам нужно изменить файл VBCSCompiler.exe.config( "C:\Program Files (x86)\MSBuild\14.0\Bin\VBCSCompiler.exe.config" ) и установить необходимое значение в секундах (по умолчанию оно 600).

Ответ 6

Также столкнулась с этой проблемой с Visual Studio Enterprise 2015, Update 1. Проблема была решена путем обновления до обновления 2.

Ответ 7

Я обнаружил, что изменение идентификатора на "NetworkService" в расширенных настройках пула приложений отсортировало проблему для меня.