2013-03-21 14 views
8

Ho fatto una pulizia di primavera nel mio codice suddividendolo in più pacchetti Go, principalmente per aiutare la riusabilità (ogni "blocco predefinito" nel proprio pacchetto)."overflow stack nosplit" durante la costruzione del progetto Go?

Dopo aver corretto gli errori di importazione, ho scoperto che il mio programma improvvisamente non verrà generato. L'esecuzione di "go build" restituisce un errore nosplit stack.

robot main.init: nosplit overflow dello stack

120  guaranteed after split check in main.init 
    112  on entry to robot/web.init 
    104  on entry to robot/controller.init 
    96  on entry to robot/slam.init 
    88  on entry to robot/slam/hector.init 
    80  on entry to hectormapping/map/mapimages.init 
    72  on entry to hectormapping/map/maprep.init 
    64  on entry to hectormapping/map/mapproccontainer.init 
    56  on entry to hectormapping/scanmatcher.init 
    48  on entry to hectormapping/map/gridmap/occbase.init 
    40  on entry to hectormapping/map/gridmap/base.init 
    32  on entry to hectormapping/map/gridmap.init 
    24  on entry to github.com/skelterjohn/go%2ematrix.init 
    16  on entry to math.init 
    8  on entry to math.init┬À1 
    0  on entry to runtime.panicindex 
    -8  on entry to runtime.morestack00 

runtime.main: nosplit overflow dello stack

120  guaranteed after split check in runtime.main 
    128  after runtime.main uses -8 
    120  on entry to main.init 
    112  on entry to robot/web.init 
    104  on entry to robot/controller.init 
    96  on entry to robot/slam.init 
    88  on entry to robot/slam/hector.init 
    80  on entry to hectormapping/map/mapimages.init 
    72  on entry to hectormapping/map/maprep.init 
    64  on entry to hectormapping/map/mapproccontainer.init 
    56  on entry to hectormapping/scanmatcher.init 
    48  on entry to hectormapping/map/gridmap/occbase.init 
    40  on entry to hectormapping/map/gridmap/base.init 
    32  on entry to hectormapping/map/gridmap.init 
    24  on entry to github.com/skelterjohn/go%2ematrix.init 
    16  on entry to math.init 
    8  on entry to math.init┬À1 
    0  on entry to runtime.panicindex 
    -8  on entry to runtime.morestack00 

Qualcuno sa di cosa si tratta? Non riesco a trovare molta documentazione su cosa potrebbe causarlo, tranne che per alcuni casi questo è a bug that supposedly is fixed.

Parte del codice è stato suddiviso in una nuova cartella nella cartella "src", in modo che la struttura del file è ora:

src/robot/main.go (main() lives here) 
src/robot/(...) (application-specific packages) 
src/hectormapping/(...) (stand-alone package used in "robot") 

Sto usando Go 1.0.3 su Windows 7 (x64).

+0

Hai provato con go tip piuttosto che stabile? –

+0

@ NickCraig-Wood No, c'è un modo semplice per farlo in Windows? – Mikke

+1

Non conosco un 'msi' per il consiglio di go, ma puoi [build from source] (http://golang.org/doc/install/source) se hai un compilatore abbastanza facilmente. –

risposta

5

Questo sembra essere lo stesso descritto here che è stato detto di essere fisso in punta. La correzione corrispondente può essere rivista here.

Per riassumere il problema come lo sto vedendo: Split stacking viene utilizzato per la crescita di stack anziché dell'area di memoria fissa convenzionale. Questo ha il vantaggio che possono essere generati più thread, in quanto solo la memoria dello stack necessaria è effettivamente riservata. Il problema qui sembra essere che il linker contrassegna le funzioni che non usano accidentalmente la memoria sullo split stack come 'nosplit' perché non trova il prologo dello split split. Questo porta al linker che calcola un limite di stack errato, che a sua volta consente al linker di pensare che non ci sia spazio e lancia il messaggio di errore.

Purtroppo, l'unico modo per ottenere la versione di suggerimento è compilarlo da solo. Come già detto da Nick Craig-Wood, puoi trovare le istruzioni here. Se davvero non è possibile eseguire l'aggiornamento, è possibile provare a risolvere questo problema allocando alcune variabili locali arbitrarie nelle funzioni init. Ma questo è molto caotico, naturalmente.

+0

Tu e Nick Craig-Wood avete ragione, il problema è risolto nella versione tip! L'installazione della versione di punta non si è rivelata un grosso problema, solo un 'hg clone' e un file' .bat' in esecuzione. Ho incontrato un altro problema, ma è probabilmente correlato a 'cgo' e non correlato all'argomento di questa domanda. Grazie per la risposta, e anche per la soluzione alternativa, che potrebbe rivelarsi utile! – Mikke

Problemi correlati