有时我的构建会因此错误而失败。
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()
经过大量的时间和研究试图解决这个问题,我找到了一个适合我的解决方案。我正在使用msbuild和/ m和/ p:BuildInParallel = true并且构建在CI服务器中失败。在第二个组件中总是失败并出现错误:
错误MSB4166:子节点“3”过早退出。关机
添加/ nodeReuse:false修复了问题。
这是一个很好的参考:https://blogs.msdn.microsoft.com/msbuild/2007/04/16/node-reuse-in-multiproc-msbuild/
正如在对问题的意见交换中所讨论的:
奇怪的是,我在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使用率。完成这些文件后,速度将恢复。
就我而言,答案是更新Antlr。显然,这仅适用于您在项目中使用Antlr的情况。
您可能内存不足,导致其中一个构建子进程失败 - 如果使用/ m:2将其限制为两个并发构建,它会失败吗? (假设你有超过2个核心)
或者,如果您可以从另一台计算机借用一些RAM,或者增加交换机大小,那么当您的构建计算机上安装了更多内存时,它是否会更少发生?
也许它的构建等同于竞争条件?
http://blogs.msdn.com/b/msbuild/archive/2007/04/26/building-projects-in-parallel.aspx
如果您使用普通的Reference标记来依赖另一个项目的输出(该项目是构建的一部分)(而不是ProjectReference标记),您可能会遇到项目X通常在项目Y之前完成的情况(这取决于项目X的输出)但偶尔它们会同时构建,在这种情况下,当Y去寻找它时,X的输出将不存在,导致Y失败。我找不到MSBuild在那种情况下给出的错误输出类型(并且现在没有现成的测试方法),所以可能不是这样。
结果的不一致性(通常是成功的,偶尔会失败)使我怀疑这样的事情可能是原因。
我们得到了相同的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节点重用功能,从而解决了这个问题。
只是想为那些无法解决此问题的人添加我的案例和解决方案。
对我来说,这是因为我无意中将.NET Framework 4.6.1项目的项目引用添加到我的一个.NET Standard 2.0项目中。在撰写本文和VS 2017 15.9.12时,您可能几乎没有注意到这是“参考文献”中解决方案资源管理器中显示的“黄色三角形”符号,表明可能存在错误。我有几个项目的解决方案,在Build Solution的中间某个地方,随着项目的“Child Node X过早退出”,它将失败,并且在失败的地方永远不会一致。
一旦我将错误追溯到违规的.NET Framework 4.6.1引用项目,我将此.NET Framework 4.6.1项目转换为.NET Standard 2.0,并且所有这些Child Node X错误都消失了。
希望这有助于任何人阅读。