Ошибка MSB4166: ребенок node вышел преждевременно. Выключение
Иногда моя ошибка сбоя с этой ошибкой.
0>MSBUILD : error MSB4166: Child node "3" exited prematurely. Shutting down.
Это кажется совершенно случайным, и я не смог воспроизвести его по своему усмотрению. Я запускаю VS2010 Win7 x64 MSBuild 4.0, но эта проблема, похоже, не зависит от платформы и ОС. Я строю решения параллельно (/m switch + BuildInParallel = True), и я не хочу отключать эту функцию, потому что я компилирую приложение, содержащее более 800 проектов. Любая идея, как его решить?
EDIT: Когда я установил предварительный просмотр .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()
Ответы
Ответ 1
Как обсуждалось в обмене комментариями на вопрос:
Странно то, что я использую 64-битную MSBuild на 64-битном ноутбуке Win7 с 4 ГБ физической и "неограниченной" виртуальной оперативной памяти. Процесс MSBuild использует около 1 ГБ оперативной памяти (пик 1,5 ГБ). - Ludwo 4 часа назад
Я использую 32-разрядный MSBuild на 32-разрядном рабочем столе WinXP с 2 ГБ физической и аналогичной неограниченной виртуальной оперативной памяти. Странно то, что авария происходит, когда физическая RAM полностью израсходована. Как будто у меня нулевая виртуальная память! - Кевин Вермеер 3 часа назад
Да, похоже, что MSBuild не использует виртуальную память:) - Ludwo 2 часа назад
Казалось, что MSbuild не использует виртуальную память. Я сделал несколько тестов (начиная набор программ), и казалось, что ничто не использует виртуальную память. Я сделал несколько поисков, которые заставили меня проверить
Control Panel -> System -> Advanced -> Performance -> Advanced -> Virtual Memory
и обнаружил, что существует параметр, который ограничивал размер моей виртуальной памяти в масштабах всей системы. Я предположил, что виртуальная память должна быть практически бесконечной или, точнее, 4 ГБ для каждого процесса на 32-разрядной XP. Я не подходил к этому пределу. Однако мое пространство виртуальной памяти было ограничено... 0 МБ. Не круто, кто бы ни делал это.
Я изменил это, чтобы выделить минимум 1024 МБ и максимум 4096 МБ виртуальной памяти. Я добавил столбец "Виртуальный размер" в Process Explorer, который вместе с графиком "Системная фиксация" демонстрирует, что теперь я использую больше памяти, чем количество доступных в палках физической памяти.
Это устранило мои проблемы. К сожалению, моя система постоянно останавливается, когда он пытается распечатать любую память, но это лучше, чем крушение. Я снова включил параллельные сборки; он распараллеливает и использует много CPU, в то время как у меня осталось ОЗУ (что верно для большинства файлов) и опускается до 1% от использования ЦП, когда у меня больше нет ОЗУ. Когда эти файлы будут выполнены, скорость будет восстановлена.
Ответ 2
В моем случае ответ должен был обновить Antlr. Очевидно, что это применимо только в том случае, если вы используете Antlr в своем проекте.
Ответ 3
У вас может быть нехватка памяти, из-за чего один из подпроцессов сборки завершится с ошибкой - не получится ли это, если вы используете /m: 2, чтобы ограничить его двумя параллельными сборками? (при условии, что у вас более 2 ядер)
Или, если вы можете одолжить какую-то оперативную память с другого компьютера или увеличить свой размер подкачки, это случается реже, если на вашей машине сборки больше памяти?
Ответ 4
Возможно, это строительный эквивалент состояния гонки?
http://blogs.msdn.com/b/msbuild/archive/2007/04/26/building-projects-in-parallel.aspx
Если вы используете обычный тег Reference для зависимости от другого проекта, который является частью сборки (а не тега ProjectReference), вы можете получить ситуацию, когда обычно выполняется проект X до проекта Y (что зависит на выходе проекта X), но иногда они строятся параллельно, и в этом случае вывод X не будет существовать, когда Y будет искать его, что приведет к сбою Y. Я не могу найти ничего о том, какой вывод ошибки MSBuild дает в этой ситуации (и у него нет доступного способа проверить его сейчас), так что может и не быть.
Тем не менее несогласованность результатов (часто успешная, иногда неудачная) приводит меня к подозрению, что что-то подобное может быть причиной.
Ответ 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/
Ответ 6
Мы получили ту же ошибку 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)
===================
Мы смогли решить эту проблему, отключив функцию повторного использования узла msbuild, установив переменную среды MSBUILDDISABLENODEREUSE=1
.
Ответ 7
Просто хотел добавить мой случай и решение для тех, кто не смог решить эту проблему с другими ответами здесь.
Для меня это было потому, что я случайно добавил ссылку на проект .NET Framework 4.6.1 в один из моих проектов .NET Standard 2.0. На момент написания этой статьи и VS 2017 15.9.12 вы можете едва заметить это как символ "желтого треугольника", показанный в обозревателе решений в ваших ссылках, что что-то может быть не так. У меня было решение с несколькими проектами, и где-то в середине Build Solution оно не получалось с этим "Дочерним узлом X преждевременно завершенным", на случайных проектах и никогда не соответствовало тому, где оно не удалось.
После того, как я отследил ошибку до ссылочного проекта .NET Framework 4.6.1, я преобразовал этот проект .NET Framework 4.6.1 в .NET Standard 2.0, и все эти ошибки дочернего узла X исчезли.
Надеюсь, что это помогает любому читать.