2012-12-03 17 views
8

My Mono application crash su Mac con questo messaggio (Full log):Stack Overflow in non gestito: IP: 0x26eb76, colpa addr: 0xbf808ffc

$ mono --debug bin/Debug/SparkleShare.app/Contents/MonoBundle/SparkleShare.exe 
[...] 
Stack overflow in unmanaged: IP: 0x26eb76, fault addr: 0xbf808ffc 
[...] 

"in non gestito" implica che l'overflow dello stack non è nel mio codice (I solo il codice gestito) ma piuttosto in una libreria che incorporo (SQLite, DotCmis, NewtonSoft.Json) o nel codice di Mono.

Anche se compilo ed eseguo in modalità Debug, tutto ciò che ottengo sono questi due esadecimali.

DOMANDA: Come posso esaminare questo overflow di stack? Qualche trucco?

Nota: le stesse librerie (con praticamente lo stesso codice) funzionano correttamente su Linux e Windows.

risposta

4

L'overflow dello stack di gestione è piuttosto complicato (per mono), quindi potrebbe essere che l'overflow dello stack sia effettivamente tuo. Il problema sta nel capire la traccia dello stack.

Io di solito corro con gdb:

gdb --args mono --debug bin/Debug/SparkleShare.app/Contents/MonoBundle/SparkleShare.exe 

e quindi provare a premere Ctrl + C dopo la pila ha cominciato a crescere, ma prima che sia effettivamente sorvolato (gdb ottiene seriamente confuso con overflow dello stack, e si Di solito è necessario uscire da gdb quando ciò accade, motivo per cui è necessario catturare l'overflow in azione).

Dopo aver premuto Ctrl + C, fare un thread apply all backtrace, e si saprà se sta per accadere uno stack overflow (un thread avrà migliaia di frame).

Una volta che c'è un'enorme traccia di stack in gdb, è necessario identificare il ciclo. Questo di solito è abbastanza semplice osservando gli indirizzi della traccia dello stack. Una volta che avete questi dati, è possibile ottenere la cornice gestito in questo modo:

(gdb) p mono_pmip (0xdeaddead) 
$1 = 0x0000dead "Managed frame information shows up here" 

Poi basta fare lo stesso per tutti i fotogrammi del ciclo che hai trovato.

Ci sono altri suggerimenti per il debug di mono con gdb here.