2012-12-03 15 views
8

My Mono application stürzt auf Mac mit dieser Nachricht (Full log):Stack-Überlauf in nicht verwalteten: IP: 0x26eb76, Fehler Adr: 0xbf808ffc

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

"in unmanaged" bedeutet, dass der Stack-Überlauf nicht in meinem Code ist (I habe nur Code verwaltet), sondern in einer Bibliothek, die ich eingebettet (SQLite, DotCmis, NewtonSoft.Json) oder in Mono-Code.

Obwohl ich im Debug-Modus kompiliere und laufe, bekomme ich nur diese zwei Hexadezimalzahlen.

FRAGE: Wie kann ich diesen Stapelüberlauf untersuchen? Irgendein Trick?

Hinweis: Die gleichen Bibliotheken (mit ziemlich dem gleichen Code) laufen gut unter Linux und Windows.

Antwort

4

Der Handling-Stack-Overflow ist ziemlich kompliziert (für Mono), daher kann es sehr wohl sein, dass der Stack-Overflow tatsächlich deins ist. Das Problem liegt darin, die Stapelspur herauszufinden.

ich in der Regel mit gdb laufen:

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

Und dann versuchen Sie Strg + C zu treffen, nachdem der Stapel zu wachsen begonnen hat, aber bevor es tatsächlich übergelaufen ist (GDB wird mit Stack überläuft ernsthaft verwirrt, und Sie Normalerweise muss ich gdb beenden, wenn das passiert, weshalb Sie den Überlauf in Aktion fangen müssen.

Nachdem Sie Strg + C gedrückt haben, machen Sie eine thread apply all backtrace, und Sie werden wissen, ob ein Stack-Überlauf passieren wird (ein Thread wird Tausende von Frames haben).

Sobald Sie eine enorme Stack-Trace in gdb haben, müssen Sie den Zyklus identifizieren. Dies ist normalerweise ziemlich einfach, wenn man nur die Adressen der Stapelverfolgung betrachtet. Sobald Sie diese Daten haben, können Sie den verwalteten Rahmen wie diese:

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

Dann tun genau das gleiche für alle Frames in dem Zyklus Sie gefunden.

Es gibt weitere Tipps zum Debuggen von Mono mit Gdb here.