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

问题描述 投票:22回答:7

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

 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()
multithreading msbuild msbuild-4.0
7个回答
5
投票

经过大量的时间和研究试图解决这个问题,我找到了一个适合我的解决方案。我正在使用msbuild和/ m和/ p:BuildInParallel = true并且构建在CI服务器中失败。在第二个组件中总是失败并出现错误:

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

添加/ nodeReuse:false修复了问题。

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


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
投票

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


1
投票

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

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


1
投票

也许它的构建等同于竞争条件?

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

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

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


1
投票

我们得到了相同的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节点重用功能,从而解决了这个问题。


0
投票

只是想为那些无法解决此问题的人添加我的案例和解决方案。

对我来说,这是因为我无意中将.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错误都消失了。

希望这有助于任何人阅读。

© www.soinside.com 2019 - 2024. All rights reserved.