Na tento konkrétní problém nemám odpověď, ale mohu se pokusit vám napovědět, co se může stát:Chybějící závislosti v Makefiles.
Příklad:
target: a.bytecode b.bytecode
link a.bytecode b.bytecode -o target
a.bytecode: a.source
compile a.source -o a.bytecode
b.bytecode: b.source
compile b.source a.bytecode -o a.bytecode
Pokud zavoláte make target
vše se zkompiluje správně. Kompilace a.source
se provádí (libovolně, ale deterministicky) jako první. Poté kompilace b.source
se provádí.
Ale pokud make -j2 target
oba compile
příkazy budou spouštěny paralelně. A skutečně si všimnete, že závislosti vašeho Makefile jsou přerušené. Druhá kompilace předpokládá a.bytecode
je již zkompilován, ale nezobrazuje se v závislostech. Je tedy pravděpodobné, že dojde k chybě. Správný řádek závislosti pro b.bytecode
by mělo být:
b.bytecode: b.source a.bytecode
Abych se vrátil k vašemu problému, pokud nemáte štěstí, je možné, že příkaz zasekne ve 100% smyčce CPU kvůli chybějící závislosti. To se zde pravděpodobně děje, chybějící závislost nemohla být odhalena sekvenčním sestavením, ale byla odhalena vaším paralelním sestavením.
Nevím, jak dlouho máte stroj, ale moje první doporučení by bylo zkusit test paměti a ověřit, zda paměť funguje správně. Vím, že problém často není v paměti, ale pokud ano, je nejlepší ji nejprve odstranit jako příčinu, než se pokusíte vysledovat další pravděpodobné problémy.
Uvědomuji si, že je to opravdu stará otázka, ale stále se objevuje v horní části výsledků vyhledávání, takže zde je moje řešení:
GNU make má mechanismus jobserveru, který zajišťuje, že make a její rekurzivní potomci nespotřebovávají více jader, než je specifikovaný počet:http://make.mad-scientist.net/papers/jobserver-implementation/
Spoléhá na kanál sdílený všemi procesy. Každý proces, který chce rozdělit další děti, musí nejprve spotřebovat žetony z potrubí a poté je po dokončení vzdát. Pokud podřízený proces nevrátí tokeny, které spotřeboval, make-up nejvyšší úrovně zůstane navždy viset a čeká na jejich vrácení.
https://bugzilla.redhat.com/show_bug.cgi?id=654822
Na tuto chybu jsem narazil při sestavování binutilů pomocí GNU make na mém Solaris boxu, kde "sed" není GNU sed. Pohrávání si s PATH, aby sed==gsed měl přednost před systémovým sed, problém vyřešil. Nevím, proč sed spotřebovával žetony z potrubí.