【问题标题】:Numerous instances of VBCSCompiler.exeVBCSCompiler.exe 的多个实例
【发布时间】:2015-10-20 22:11:14
【问题描述】:

我最近刚刚下载并安装了 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 的每个发布版本。我认为周围没有任何测试版。

-Kyle Trauberman,我对 Visual Studio 上下文中的环境变量不太熟悉;但是,我在 VS(和 MSBuild)命令提示符窗口中天真地运行了 set DisableRosyln=true。这似乎没有任何影响。 VBCSCompiler.exe 会在重启 VS2015 后立即备份。

我修复了我的 VS2015 安装并执行了重新启动。这没有帮助。

更新第 2 部分 (8/7) -Hans 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;
}

**让我与您讨论传递给 VBCSCompiler.exe 实例的特定 pipname 参数。我将不得不等到它再次发生。

【问题讨论】:

  • 可能希望将标签从 visual-studio 更改为特别是 visual-studio-2015,因为它特定于该版本。这样可能会得到更熟悉此事的人的更多关注。
  • 我遇到了同样的问题:22 个 VBCSCompiler.exe 进程同时运行,使用 100% CPU(16 个内核)和每个 300MB 的 RAM。我注意到当我更改项目的 mercurial 分支并让 VS 重新加载解决方案然后构建时会发生这种情况。此时我必须手动终止进程或注销。
  • @gigi 有时我也会遇到同样的情况。你使用 ReSharper 吗?
  • @splattne 是的,我愿意。最新版本可用。你认为这可能是原因吗?
  • 补充说我也遇到过这个问题,但我不使用 Resharper

标签: c# .net visual-studio-2015 roslyn


【解决方案1】:

根据 Slaks,您可以通过将 DisableRoslyn 环境变量设置为 true 来禁用 roslyn(这是 VBCSCompiler.exe 的样子)。

更多信息请参见http://blog.slaks.net/2014-05-21/exploring-roslyn-part-2-inside-end-user-preview/

请注意,上面的链接是用于预览的,但我无法想象从那时到现在它会发生很大变化。

【讨论】:

    【解决方案2】:

    嗯,没有明显的重现场景,没有其他人抱怨这一点。您的解决方案一点也不稀奇。将 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++)
    

    错误版本丢失了\\.\pipe\


    请注意,在上面的 sn-p 中错误检查非常不充分,File.Exists() 出于多种原因返回 false。这也是早期没有发现该错误的基本原因。这会启用几种可能的故障模式,如果您的机器被程序员自愿安装的典型压缩包装恶意软件感染,则会启用这种模式。服务器和客户端代码通过具有特殊名称的命名管道相互连接。您可以在任务管理器的进程选项卡中看到的内容。使用视图 > 选择列(Win8 及更高版本:右键单击列标题)并勾选“命令行”选项:

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

    【讨论】:

    • 我遇到了同样的问题。我的 VBCSCompiler.exe 来自我的网络应用程序的 bin 文件夹。需要更新软件包。
    【解决方案3】:

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

    Roslyn 使用共享编译器进程,将编译后的代码保存在内存中,以便在后续编译中重复使用。因此第二次编译会更快,但正如您所见,存在内存开销。

    有什么办法阻止这种情况发生?

    是的。从 here 开始,msbuild 中有一个 compile 任务的属性,它关闭了共享编译器,它被 default 设置为 true。

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

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

    【讨论】:

    • 这也发生在我身上。VS2015免费版做MVC5开发。我已经出现了 14 多个 VCCSCompiler 实例,将我的笔记本电脑变成了一个熔炉。您对 UseSharedCompilation 的建议有所帮助,我仍然不时出现多个实例,但不超过 5 个。
    • 我遇到了这个问题,VS2105, 14.0.25425.01 Update 3。请参阅我上面的评论。这个答案有效 - 一旦我在解决方案中的所有项目上做了它,似乎只启动了一个。
    • 这对我也有用,我有大约 10 个实例使用了我所有的 cpu,一旦我进行了这个更改,它就会下降到可管理的资源量,非常感谢!
    【解决方案4】:

    截至 2015 年 11 月 22 日,我在 Visual Studio 2015 社区版中仍然遇到此问题。我的笔记本电脑开始兼作空间加热器,所有 VBCSCompiler 实例都在全速运行。

    唯一对我有用的解决方法是在 Web 应用程序的 /bin/roslyn 目录中找到文件 VBCSCompiler.exe 并对其更改安全权限

    您需要拒绝对运行您的 Web 应用的 AppPool 的读取和执行权限。

    【讨论】:

    • @jerhewet 很高兴它帮助节省了一些人的 CPU 周期
    • 这不是解决办法。执行此应用程序后立即开始崩溃:访问路径 'D:\....\bin\roslyn\csc.exe' 被拒绝。
    • 使用应用程序池的名称很重要。
    【解决方案5】:

    您还可以更改 VBCSCompiler 的“保持活动”选项,以在执行后立即关闭它... 您需要修改“VBCSCompiler.exe.config”文件(“C:\Program Files (x86)\MSBuild\14.0\Bin\VBCSCompiler.exe.config”)并以秒为单位设置所需的值(默认为 600)。

    【讨论】:

    • 1 分钟后出现同样的问题。
    • 更改此设置并不能解决任何问题。流氓进程不认为自己是空闲的,因此它们从不开始倒计时。
    【解决方案6】:

    在 Visual Studio Enterprise 2015 更新 1 中也遇到了这个问题。 该问题已通过升级到更新 2 得到解决。

    【讨论】:

    • 你能再解释一下吗?
    【解决方案7】:

    我发现在应用程序池高级设置中将身份更改为“NetworkService”为我解决了问题。

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多