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


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

Я открыл Диспетчер задач Windows и заметил: > 10 VBCSCompiler.исполняемые задачи. В сочетании эти задачи отправили ЦП > 90%.

есть идеи, почему так много этих задач выполняется? Есть ли способ остановить это?

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

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

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

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

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

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

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

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

мой "библиотеки DLL на стороне клиента "(расположены по адресу C:Program файлы (x86)MSBuild14.0BinMicrosoft.Строить.Задачи.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.исполняемый. Мне придется подождать, пока это не повторится.

7 56

7 ответов:

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

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

enter image description here

обратите внимание, что намеренно скрыл некоторые столбцы, чтобы держать его читаемым. Метки времени-это часовой пояс CST.


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

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

версия багги отсутствовала \.\pipe\.


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

Примечание

есть идеи, почему так много этих задач выполняется?

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

любой способ остановить это происходит?

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

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

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

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

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

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

enter image description here

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

см.http://blog.slaks.net/2014-05-21/exploring-roslyn-part-2-inside-end-user-preview/ для получения дополнительной информации.

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

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

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

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