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

时间:2011-10-27 13:37:45

标签: multithreading msbuild msbuild-4.0

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

 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()

7 个答案:

答案 0 :(得分: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使用率。完成这些文件后,速度将恢复。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

经过大量时间和研究以解决此问题,我找到了一个对我有用的解决方案。 我将MSbuild与/ m和/ p:/ BuildInParallel = true一起使用,并且CI服务器中的构建失败。在第二个组件中总是失败,并显示以下错误:

错误MSB4166:子节点“ 3”过早退出。关机。

添加/ nodeReuse:false可以解决此问题。

这是一个很好的参考: https://blogs.msdn.microsoft.com/msbuild/2007/04/16/node-reuse-in-multiproc-msbuild/

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

也许这就是比赛条件的构建等价物?

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

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

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

答案 5 :(得分:0)

我们遇到了相同的msbuild错误,并且在日志文件中有

UNHANDLED EXCEPTIONS FROM PROCESS 10260:
=====================
05/01/2019 18:41:55
System.IO.IOException: Pipe is broken.
  at System.IO.Pipes.PipeStream.WinIOError(Int32 errorCode)
  at System.IO.Pipes.PipeStream.BeginWriteCore(Byte[] buffer, Int32 offset, Int32 count, AsyncCallback callback, Object state)
  at System.IO.Pipes.PipeStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
  at System.IO.Pipes.PipeStream.Write(Byte[] buffer, Int32 offset, Int32 count)
  at Microsoft.Build.BackEnd.NodeEndpointOutOfProcBase.RunReadLoop(Stream localReadPipe, Stream localWritePipe, ConcurrentQueue`1 localPacketQueue, AutoResetEvent localPacketAvailable, AutoResetEvent localTerminatePacketPump)
===================

我们能够通过设置环境变量MSBUILDDISABLENODEREUSE=1来禁用msbuild-node重用功能来解决此问题。

答案 6 :(得分:0)

只是想为那些无法通过此处其他答复解决此问题的人添加我的案情和解决方案。

对我来说,这是因为我无意中向.NET Standard 2.0项目之一添加了对.NET Framework 4.6.1项目的项目引用。在撰写本文和VS 2017 15.9.12时,您可能几乎没有注意到这是“参考”的“解决方案资源管理器”中的“黄色三角形”符号,可能是有问题。我有一个包含多个项目的解决方案,并且在Build Solution的某个中间位置,它将因随机项目上的“子节点X过早退出”而失败,并且永远不会在失败的地方保持一致。

一旦我将错误追溯到有问题的.NET Framework 4.6.1参考项目,就将该.NET Framework 4.6.1项目转换为.NET Standard 2.0,并且所有这些Child Node X错误都消失了。

希望这可以帮助任何人阅读。