2011-10-27 14 views
16

A volte la mia build fallisce con questo errore.errore MSB4166: il nodo figlio è uscito prematuramente. Spegnimento

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

Sembra essere completamente casuale e non sono stato in grado di riprodurlo a piacere. Sono in esecuzione VS2010 Win7 x64 MSBuild 4.0 ma questo problema sembra essere indipendente dalla piattaforma e dal sistema operativo. Sto creando soluzioni in parallelo (switch/m + BuildInParallel = True) e non voglio disabilitare questa funzione perché sto compilando un'applicazione contenente oltre 800 progetti. Qualche idea su come risolverlo?

EDIT: Quando ho installato .NET 4.5 Developer Preview, registrazione degli errori è stata migliorata nel MSBuild 4.5 e ora la stringa di errore simile al seguente:

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 

posso trovare l'errore file di registro nella cartella Temp. . Questo è il contenuto di MSBuild _ file * 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() 
+0

Ho gli stessi problemi. Ho anche visto eccezioni out-of-memory relative a questo errore. Limitare a una build simultanea non aiuta; ancora errori fuori: [Vedi lo screenshot qui] (http://i.stack.imgur.com/FSyuG.png); l'errore si verifica esattamente quando il consumo di memoria supera la memoria fisica disponibile. Ha avuto alcuni stretti colpi con la morte e poi ha raggiunto il massimo e morì, eliminando Outlook e Process Explorer con esso, offrendo un debugger JIT che non si avviava e rilasciando MSBuild.exe per diventare un processo di zombie seduto sulla memoria fino a quando non lo uccido manualmente. –

+0

La cosa strana è che sto usando 64bit MSBuild su un laptop Win7 a 64 bit con 4 GB di RAM virtuale "illimitata" fisica. Il processo MSBuild utilizza circa 1 GB di RAM (picco di 1,5 GB). – Ludwo

+0

Utilizzo MSBuild a 32 bit su un desktop WinXP a 32 bit con 2 GB di RAM virtuale fisica e analogamente illimitata. La cosa strana è che l'arresto anomalo si verifica quando la RAM fisica è completamente esaurita. È come se avessi zero memoria virtuale! –

risposta

1

Si potrebbe essere a corto di memoria, causando uno dei processi di generazione secondari per fallire - non fallire di meno se si utilizza/m: 2 per limitare a due build simultanei? (supponendo che tu abbia più di 2 core)

Oppure, se puoi prendere in prestito della RAM da un'altra macchina o aumentare la dimensione dello scambio, accade meno spesso quando hai più memoria installata sulla macchina di compilazione?

+0

Ho solo 2 core. A volte la mia build non riesce a uscire dall'eccezione di memoria. Farò qualche ricerca e ti farò sapere ... – Ludwo

+0

Ho molta memoria libera e il mio errore è fallito. Dovrebbe essere in qualche modo correlato alla limitazione della memoria di processo a 32 bit perché la mia build utilizza più di 2 GB di RAM. Ma non vedo come dovrebbe essere possibile perché il mio processo MSBuild è a 64 bit. – Ludwo

2

Come discusso nello scambio di commenti alla domanda:

cosa strana è che sto usando 64bit MSBuild su 64bit Win7 portatile con 4 GB di RAM fisica e virtuale "illimitato". Il processo MSBuild utilizza circa 1 GB di RAM (picco di 1,5 GB). - Ludwo 4 ore fa

sto usando 32 bit MSBuild su un 32bit WinXP desktop con 2 GB di RAM virtuale fisica e allo stesso modo illimitato. La cosa strana è che l'arresto anomalo si verifica quando la RAM fisica è completamente esaurita. È come se avessi zero memoria virtuale! - Kevin Vermeer 3 ore fa

Sì, sembra che MSBuild non utilizza la memoria virtuale :) - Ludwo 2 ore fa

E mi sembrava MSBuild non stava usando virtuale memoria. Ho fatto alcuni test (iniziando un sacco di programmi) e sembrava che non usasse la memoria virtuale il. Ho fatto alcune ricerche, che mi portano a controllare

Control Panel -> System -> Advanced -> Performance -> Advanced -> Virtual Memory 

e ha scoperto che esiste una regolazione che ha limitato la mia virtuale a livello di sistema dimensione della memoria. Avevo immaginato che la memoria virtuale fosse effettivamente infinita, o, più precisamente, 4 GB per ogni processo su XP a 32 bit. Non mi stavo avvicinando a questo limite. Tuttavia, il mio spazio di memoria virtuale era limitato a ... 0 MB. Non bello, chiunque o qualunque cosa abbia fatto.

Ho modificato questo valore per allocare un minimo di 1024 MB e un massimo di 4096 MB di memoria virtuale. Ho aggiunto la colonna "Dimensione virtuale" in Process Explorer, che, insieme al grafico "Commit del sistema", dimostra che ora utilizzo più memoria rispetto alla quantità disponibile nella RAM fisica.

Questo ha risolto i miei problemi. Sfortunatamente, il mio sistema si ferma quasi all'istante ogni volta che tenta di inviare una pagina a qualsiasi memoria, ma è meglio di un crash. Ho riattivato le build parallele; Parallelizza e usa molta CPU mentre ho una RAM rimasta (il che è vero per la maggior parte dei file) e scende all'1% dell'utilizzo della CPU quando non ho più RAM. Al termine di questi file, la velocità viene ripristinata.

+0

La mia VM è abilitata e il sistema è gestito – Ludwo

+0

@Ludwo - Questa è una buona cosa, e ci sono certamente molte possibili cause per questo tipo di errore, ma hai provato a impostarla manualmente? –

+0

Non si tratta di un problema relativo alle impostazioni della VM. Ho 800 MB di memoria libera. Ora controllerò se è causato da estensioni a 32 bit o no ... – Ludwo

1

Forse è l'equivalente di una condizione di gara?

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

Se si utilizza un tag di riferimento normale per una dipendenza dalla uscita di un altro progetto che fa parte del build (piuttosto che un tag ProjectReference) si potrebbero ottenere una situazione in cui viene completata solito progetto X prima del progetto Y (che dipende dall'output del progetto X) ma occasionalmente si costruiscono contemporaneamente, nel qual caso l'output di X non esisterebbe quando Y è andato a cercarlo, causando il fallimento di Y. Non riesco a trovare nulla sul tipo di output di errore che MSBuild fornisce in quella situazione (e non ho un modo prontamente disponibile per testarlo proprio ora), quindi potrebbe non esserlo.

Ancora l'incongruenza nei risultati (spesso riuscita, a volte fallisce) mi porta a sospettare che qualcosa del genere possa essere la causa.

+0

No. Ho un numero enorme di progetti in più soluzioni. Uso il mio task di fusione per unire le soluzioni e creo una soluzione prima di ogni generazione per poter creare tutti i progetti in parallelo. Nell'operazione di unione delle soluzioni, sto convertendo tutti i riferimenti nei riferimenti del progetto, se possibile. Quindi i miei file di progetto vengono aggiornati dopo che le soluzioni si sono unite come descritto nell'esempio 2 nel tuo articolo collegato. – Ludwo

+0

+1 per la tua risposta perché mi hai indirettamente spiegato perché solo una istanza di MSBuild è attiva mentre altre istanze sono inattive. Nella discussione ho trovato il collegamento a [questo bug] (https://connect.microsoft.com/VisualStudio/retroazione/dettagli/635.800/MSBuild-exe-appare-to-hang-quando-maxcpucount-IS-usati-e-un-grande-numero-di-progetto riferimenti-esistono # details). È stato risolto nella futura versione di MSBuild dopo la v4.0. Devo dividere i miei progetti in parti più piccole per migliorare le prestazioni di msbuild :( – Ludwo

+0

@Ludwo - Se aiuta, ho avuto 8 progetti nella mia soluzione quando ho trovato e risolto questo problema, sono stati suddivisi in circa 800 file e 16.000 righe di codice circa il 40% di questo era contenuto in un progetto –

1

Nel mio caso, la risposta era aggiornare Antlr. Ovviamente, questo si applica solo se stai usando Antlr nel tuo progetto.

Problemi correlati