エラーMSB4166:子ノードが時期尚早に終了しました。シャットダウン

時には私のビルドがこのエラーで失敗することがあります。

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

それは完全にランダムであるように思われ、私は自由にそれを再現することができませんでした。私はVS2010 Win7 x64 MSBuild 4.0を実行していますが、この問題はプラットフォームやOSに依存しないようです。私は並列にソリューションを構築しています(/ mスイッチ+ 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
追加された 編集された
ビュー: 21
奇妙なことに、64ビットWinb7のノートパソコンに64ビットMSBuildを使用していて、4GBの物理的な「無制限」仮想RAMを使用しているということです。 MSBuildプロセスは約1GBのRAM(最大1,5GB)を使用しています。
追加された 著者 Ludwo,
はい、MSBuildは仮想メモリを使用していないようです:)
追加された 著者 Ludwo,
しかし、それは真実ではありません。私はそれをチェックし、800MBの空き物理メモリがあればこの問題で失敗しました。
追加された 著者 Ludwo,
私は同じ問題を抱えています。私はまた、このエラーに関連するメモリ不足例外を見てきました。 1つの同時ビルドに制限することは役に立ちません。それでもエラーが出ます:ここのスクリーンショットをご覧ください;メモリ消費量が物理的に利用可能なメモリを超えた場合、エラーが正確に発生します。それにはいくつかのクローズドブラシがありましたが、最大の打撃を受け、OutlookとProcess Explorerを使用してJITデバッガを起動し、MSBuild.exeをリリースしてメモリに座っているゾンビプロセスになりました私は手動でそれを殺すまで。
追加された 著者 Kevin Vermeer,
32ビットMSBuildを32ビットWinXPデスクトップで使用しています.2GBの物理的で無制限の仮想RAMがあります。奇妙なことは、物理RAMが完全に使い果たされたときにクラッシュが発生することです。それは私の仮想メモリがゼロのようなものです!
追加された 著者 Kevin Vermeer,

4 答え

質問へのコメントの交換で議論されているように:

奇妙なことは、私が64bit Win7ノートパソコンに64bit MSBuildを使用していて、物理的で無制限の仮想RAMを4GB搭載していることです。 MSBuildプロセスは約1GBのRAM(最大1,5GB)を使用しています。 - Ludwo 4時間前に

32ビットMSBuildを32ビットWinXPデスクトップで使用しています.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の仮想メモリを割り当てました。 プロセスエクスプローラに「仮想サイズ」の列を追加しました。 「System Commit」グラフは、物理RAMスティックで使用できる量より多くのメモリを使用していることを示しています。

これは私の問題を解決しました。残念なことに、私のシステムは、メモリをページングしようとするたびに、ほぼ停止するようになりますが、クラッシュよりも優れています。私は並列ビルドを再び有効にしました。私はRAMを残している間に並列化して多くのCPUを使用します(これはほとんどのファイルに当てはまります)。そして、RAMがなくなったらCPU使用量の1%に落ちます。これらのファイルが完了すると、速度が復元されます。

2
追加された
私のVMが有効にされ、システム管理されている
追加された 著者 Ludwo,
VM設定の問題ではありません。私は800MBの空きメモリを持っています。今私はそれが32ビットの拡張によって引き起こされているかどうかをチェックします...
追加された 著者 Ludwo,
@ Ludwo - それは良いことですが、確かにこの種のエラーの原因はたくさんありますが、手動で設定しようとしましたか?
追加された 著者 Kevin Vermeer,

私の場合、答えはAntlrを更新することでした。明らかに、これはAntlrをプロジェクトで使用している場合のみ適用されます。

1
追加された

メモリが足りなくなり、ビルドサブプロセスの1つが失敗することがあります。/ m:2を使用して2つの同時ビルドに制限すると、失敗は少なくなりますか? (2つ以上のコアがあると仮定して)

あるいは、別のマシンからいくつかのRAMを借りたり、スワップサイズを増やすことができれば、ビルドマシンにもっと多くのメモリがインストールされていることはあまりありませんか?

1
追加された
私は2つのコアしか持っていません。私のビルドは時々メモリの例外で失敗する。私はいくつかの調査を行い、私はあなたに知らせる...
追加された 著者 Ludwo,
私は自由な記憶がたくさんあり、また失敗しました。私のビルドでは2GB以上のRAMが使用されているため、32bitプロセスのメモリ制限に関係しているはずです。しかし、私はMSBuildプロセスが64ビットなので、どのようにするべきかわかりません。
追加された 著者 Ludwo,

おそらくそれは競合状態のビルド相当品でしょうか?

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

ビルドの一部である別のプロジェクト(ProjectReferenceタグではない)の出力に依存するために通常のReferenceタグを使用している場合、プロジェクトXの前に通常プロジェクトXが完了する状況が発生する可能性があります出力)、時には並行して構築されることもあります。その場合、Yが検索するとXの出力が存在せず、Yが失敗します。 MSBuildがそのような状況でどのようなエラー出力を出すかについては何も知ることができません(そして今すぐテストする方法はまだありません)。そうでないかもしれません。

まだ成果の矛盾(しばしば成功する、時には失敗する)は、私のようなものが原因である可能性が高いと思うようになります。

1
追加された
いいえ、私は複数のソリューションで膨大な数のプロジェクトを持っています。私はソリューションをマージするために私のマージタスクを使用し、私はすべてのプロジェクトを並列に構築できるようにすべてのビルドの前に1つの大きなソリューションを作成します。可能であれば、すべての参照をプロジェクト参照に変換しています。だから私のプロジェクトファイルは、リンクされた記事のexample2で説明されているようにソリューションがマージされた後に更新されます。
追加された 著者 Ludwo,
なぜなら、他のインスタンスがアイドルである間にMSBuildのインスタンスが1つしかアクティブでない理由を間接的に説明したからです。ディスカッションで私はこのバグ。将来のMSBuildリリースではv4.0以降で修正されています。私はmsbuildのパフォーマンスを向上させるために私のプロジェクトを小さな部分に分けなければなりません:(
追加された 著者 Ludwo,
ありがとう!これは、この大きなプロジェクトが最初にコンパイルされ、他のすべての依存プロジェクトがそれを待っていたときには正常です。
追加された 著者 Ludwo,
@ Ludwo - もしこの問題を見つけて解決したら、私のソリューションには8つのプロジェクトがありました。彼らは約800のファイルと16,000行のコードに分割されました。これの約40%が1つのプロジェクトに含まれていました。
追加された 著者 Kevin Vermeer,