VBCSCompiler.exe的大量实例

Joh*_*ell 58 .net c# roslyn visual-studio-2015

我刚刚下载并安装了Visual Studio Professional 2015(14.0.23107.0).我第一次打开解决方案(28个项目)并执行构建 - >重建解决方案时,我的开发机器出现了绝对的爬行现象.CPU的最大值为100%,构建从未完成 - 即使在> 10分钟后也是如此.

我打开了Windows任务管理器并注意到:> 10个VBCSCompiler.exe任务正在运行.合并后,这些任务使CPU> 90%.

知道为什么有这么多这些任务在运行吗?有什么方法可以阻止这种情况发生?

这是我能遇到同样问题的其他人最接近的事情:https://github.com/dotnet/roslyn/issues/2790

更新(8/7)

-Hans Passant,很棒的想法.我的经理向我提供了这个版本(14.0.23107.0).这是"官方发布"的正确版本吗?我并没有故意安装任何Visual Studio 2015的每个版本.我不认为有任何beta版本.

-Kyle Trauberman,我对Visual Studio环境中的环境变量并不熟悉; 然而,我天真地跑了set DisableRosyln=true在VS(和MSBuild)命令提示符窗口中运行.这似乎没有任何影响.即使重启VS2015,VBCSCompiler.exe也会显示正确的备份.

我修复了我的VS2015安装并执行了重启.这没有用.

更新第2部分(8/7) Passant,非常令人印象深刻的写作!虽然这次问题没有发生,但我看了你描述的事情:

至于加载了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;
}
Run Code Online (Sandbox Code Playgroud)

**让我回复一下传递给VBCSCompiler.exe实例的特定pipname参数.我将不得不等到它再次发生.

Han*_*ant 21

嗯,没有明显的repro场景,没有其他人抱怨这个.你的解决方案并不罕见.将cpu挂钩到100%并让VBCSCompiler进程吞没~1.5 GB对于一个大型项目来说并不是很难,但是当我看到我的时候它是干净利落的.

第一种可能的故障情况是你有一些未安装的beta位,这是一个非常常见的问题.使用调试器进行查看.使用Debug> Attach to Process并选择一个正在运行的实例.然后Debug> Break All和Debug> View> Modules.注意版本号和时间戳,它们应该如下所示:

在此输入图像描述

请注意,故意隐藏一些列以保持其可读性.时间戳是CST时区.


这是服务器端.遇到错误的客户端位于C:\ Program Files(x86)\ MSBuild\14.0\Bin\Microsoft.Build.Tasks.CodeAnalysis.dll.看看它的属性,我的是85,192字节,创建于2015年6月21日星期日,下午7:06:54,文件版本号1.0.0.50618.您可以使用Reflector或ILSpy等反编译器查看该文件,导航到BuildClient.TryAllProcesses().错误修复的相关行是:

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

失踪的版本丢失了\\.\pipe\.


请注意,在上面的代码片段中,错误检查非常不合适,File.Exists()由于多种原因返回false.也是之前未发现错误的基本原因.这可以实现几种可能的故障模式,如果您的计算机被程序员自愿安装的典型收缩包装恶意软件感染,则启用该类型.服务器和客户端代码通过具有特殊名称的命名管道相互连接.您可以在任务管理器,进程选项卡中看到的内容.使用"视图">"选择列"(Win8及更高版本:右键单击列标题)并勾选"命令行"选项: 在此输入图像描述

注意这个-pipename论点.如果File.Exists()调用返回false,则MSBuild将再次启动VBCSCompiler.exe.如果您看到所有这些实例都使用相同的-pipename参数运行,那么您的计算机上运行的软件会干扰正常的命名管道使用.您首先要考虑的是寻找一种不太积极的反恶意软件解决方案.您可以编写一个使用System.IO.Pipes命名空间的小测试程序来获得更好的异常消息.


Cam*_*and 20

知道为什么有这么多这些任务在运行吗?

Roslyn使用共享编译器进程,将编译后的代码保存在内存中,以便在后续编译中重用.所以第二次编译会更快,但是你已经看到了内存开销.

有什么方法可以阻止这种情况发生?

是.从这里开始,msbuild中的编译任务有一个属性可以关闭共享编译器,默认情况下它设置为true .

因此,在每个项目中,您都必须将此属性添加到项目文件中.或者在Visual Studio 2015中,现在共享项目,您可以将此属性添加到共享项目,然后在需要此设置的所有其他项目中包含该共享项目.

<PropertyGroup>
  <UseSharedCompilation>false</UseSharedCompilation>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)


Aar*_*don 7

截至2015年11月22日,Visual Studio 2015社区版本中仍然出现了这个问题.我的笔记本电脑开始兼作空间加热器,VBCSCompiler的所有实例全速运行.

对我有用的唯一修复是将文件VBCSCompiler.exe定位在Web应用程序的/ bin/roslyn目录中,并更改其上的安全权限.

您需要拒绝运行Web应用程序的AppPool的读取和执行权限.

在此输入图像描述