错误MSB4166:子节点提前退出。关机

有时我的构建会因此错误而失败。

 0>MSBUILD : error MSB4166: Child node "3" exited prematurely. Shutting down.

它似乎是完全随机的,我无法随意重现它。我正在运行VS2010 Win7 x64 MSBuild 4.0,但这个问题似乎与平台和操作系统无关。我正在并行构建解决方案(/ m switch + BuildInParallel = True),我不想禁用此功能,因为我正在编译包含800多个项目的应用程序。知道怎么解决吗?

编辑:当我安装.NET 4.5开发人员预览时,MSBuild 4.5中的错误日志记录得到了改进,现在错误字符串如下所示:

error MSB4166: Child node "3" exited prematurely. Shutting down. Diagnostic information may be found in files in the temporary files directory named MSBuild_*.failure.txt

我可以在Temp文件夹中找到错误日志文件。这是MSBuild _ *。failure.txt文件的内容:

System.InvalidOperationException: BuildEventArgs has formatted message while serializing!
   at Microsoft.Build.Framework.LazyFormattedBuildEventArgs.WriteToStream(BinaryWriter writer)
   at Microsoft.Build.Framework.BuildMessageEventArgs.WriteToStream(BinaryWriter writer)
   at Microsoft.Build.Shared.LogMessagePacketBase.WriteToStream(INodePacketTranslator translator)
   at Microsoft.Build.BackEnd.NodeEndpointOutOfProcBase.PacketPumpProc()
19
奇怪的是,我在64位Win7笔记本电脑上使用64位MSBuild,配备4GB物理和“无限”虚拟RAM。 MSBuild进程使用大约1GB的RAM(1,5GB峰值)。
额外 作者 Ludwo,
是的,好像MSBuild没有使用虚拟内存:)
额外 作者 Ludwo,
但事实并非如此。我检查了它,如果它有800MB的可用物理内存,它在这个问题上失败了。
额外 作者 Ludwo,
我遇到了同样的麻烦。我还看到了与此错误相关的内存不足异常。将它限制为同时构建并没有帮助;它仍然有错误:查看此处的屏幕截图;当内存消耗超过物理可用内存时,错误就会发生。它有几个关闭死亡的刷子,然后它达到最大值并死亡,用它取下Outlook和Process Explorer,提供一个无法启动的JIT调试器,并释放MSBuild.exe成为一个坐在内存上的僵尸进程直到我手动杀死它。
额外 作者 Kevin Vermeer,
我在32位WinXP桌面上使用32位MSBuild,具有2GB物理和类似无限的虚拟RAM。奇怪的是,物理RAM完全耗尽时会发生崩溃。这就像我的虚拟内存为零!
额外 作者 Kevin Vermeer,

4 答案

正如在对问题的意见交换中所讨论的:

奇怪的是,我在64位Win7笔记本电脑上使用64位MSBuild,具有4GB物理和“无限”虚拟RAM。 MSBuild进程使用大约1GB的RAM(1,5GB峰值)。 - Ludwo 4小时前

我在32位WinXP桌面上使用32位MSBuild,具有2GB物理和类似无限的虚拟RAM。奇怪的是,物理RAM完全耗尽时会发生崩溃。这就像我的虚拟内存为零! - Kevin Vermeer 3小时前

是的,似乎MSBuild没有使用虚拟内存:) - Ludwo 2小时前

看起来好像MSbuild没有使用虚拟内存。我做了一些测试(开始一堆程序),似乎没有使用虚拟内存。我做了一些搜索,导致我检查

Control Panel -> System -> Advanced -> Performance -> Advanced -> Virtual Memory

并发现存在一个限制我的虚拟内存大小的设置。我曾经想象虚拟内存实际上是无限的,或者更确切地说,32位XP上的每个进程都有4 GB。我没有接近这个限制。但是,我的虚拟内存空间限制为... 0MB。不酷,无论是谁或其他任何人。

我将其更改为分配最小1024 MB和最大4096 MB的虚拟内存。我在 Process Explorer 中添加了“虚拟大小”列,其中包含“系统提交”图表显示我现在使用的内存超过了物理RAM棒中可用的数量。

这解决了我的问题。不幸的是,只要它试图寻找任何内存,我的系统就会陷入近乎停顿的状态,但这比崩溃要好。我确实重新启用了并行构建;它并行化并使用大量的CPU,而我有RAM(大多数文件都是如此),当我没有更多的RAM时,它会降低到1%的CPU使用率。完成这些文件后,速度将恢复。

2
额外
我的VM已启用并受系统管理
额外 作者 Ludwo,
这不是VM设置问题。我有800MB的可用内存。现在我将检查它是否是由32位扩展引起的......
额外 作者 Ludwo,
@Ludwo - 这是一件好事,这种错误肯定有很多可能的原因,但您是否尝试过手动设置?
额外 作者 Kevin Vermeer,

就我而言,答案是更新Antlr。显然,这仅适用于您在项目中使用Antlr的情况。

1
额外

您可能内存不足,导致其中一个构建子进程失败 - 如果使用/ m:2将其限制为两个并发构建,它会失败吗? (假设你有超过2个核心)

或者,如果您可以从另一台计算机借用一些RAM,或者增加交换机大小,那么当您在构建计算机上安装了更多内存时,它是否会更少发生?

1
额外
我只有2个核心。我的构建有时会因内存不足而失败。我会做一些调查,我会告诉你的......
额外 作者 Ludwo,
我有很多空闲记忆,我再次失败了。它应该以某种方式与32位进程内存限制相关,因为我的构建使用了超过2GB的RAM。但我不知道它应该如何可能,因为我的MSBuild进程是64位。
额外 作者 Ludwo,

也许它的构建相当于竞争条件?

http://blogs.msdn.com/b/msbuild/archive/2007/04/26/building-projects-in-parallel.aspx

如果您使用普通的引用标记来依赖于构建的另一个项目(而不是ProjectReference标记)的输出,那么您可能会遇到项目X通常在项目Y之前完成的情况(这取决于项目X的输出)但偶尔它们会同时构建,在这种情况下,当Y去寻找它时,X的输出将不存在,导致Y失败。我找不到任何关于MSBuild在那种情况下输出的错误类型(并且现在没有现成的测试方法),所以可能不是这样。

结果的不一致性(通常是成功的,偶尔会失败)使我怀疑这样的事情可能是原因。

1
额外
不,我在多种解决方案中拥有大量项目。我使用合并任务来合并解决方案,并在每次构建之前创建一个大的解决方案,以便能够并行构建所有项目。在合并解决方案任务中,如果可能,我将所有引用转换为项目引用。所以我的项目文件在解决方案合并后更新,如链接文章中的example2所述。
额外 作者 Ludwo,
为你的答案+1,因为你间接地解释了为什么只有一个MSBuild实例处于活动状态而其他实例处于空闲状态。在讨论中,我发现链接到这个bug 。在v4.0之后的未来MSBuild版本中修复了它。我必须将我的项目分成更小的部分以提高msbuild的性能:(
额外 作者 Ludwo,
谢谢!因此,当首先编译这个大项目并且所有其他依赖项目都在等待它时,这是正常的。
额外 作者 Ludwo,
@Ludwo - 如果有帮助,当我找到并解决这个问题时,我的解决方案中有8个项目。它们分为大约800个文件和16,000行代码;其中约40%包含在一个项目中。
额外 作者 Kevin Vermeer,