2012-12-03 27 views
8

My Mono application çöker: "yönetilmeyen içinde"Yığın taşması 0x26eb76, arıza addr: Bu mesajın (<a href="https://github.com/nicolas-raoul/CmisSync/issues/74" rel="noreferrer">Full log</a>) ile Mac üzerinde 0xbf808ffc

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

yığın taşması benim kodunda (I olduğunu ima sadece yönetilen kod) değil, bir kütüphanede I (SQLite, DotCmis, NewtonSoft.Json gömmek) veya Mono kodunda var. Ben derlemek ve hata ayıklama modunda çalıştırmak rağmen

, elime bu iki hexadecimaller olduğunu.

SORU: Bu yığın taşmasını nasıl araştırabilirim? Herhangi bir hile?

Not: (hemen hemen aynı kodu ile) aynı kütüphaneler Linux ve Windows üzerinde ince çalıştırın. yığın taşması Handling

cevap

4

(mono için) oldukça zor, bu yüzden çok iyi yığın taşması aslında size ait olduğunu olabilir. Sorun yığın izini bulmakta yatıyor.

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

Ve sonra yığın büyümeye başladıktan sonra Ctrl + C vurmayı deneyin, ama aslında taşmıştır önce (gdb size yığını taşmaları ile ciddi karıştı alır ve: Ben genellikle gdb ile çalıştırmak

Bu durumda genellikle gdb'den çıkmak zorunda kalacaksınız, bu yüzden hareket halindeki taşmayı yakalamanız gerekecek.

Ctrl + C tuşlarına bastıktan sonra, thread apply all backtrace'u yapın ve bir yığın taşması gerçekleşmek üzere olup olmayacağını bilirsiniz (bir iş parçacığının binlerce karesi olur). Eğer gdb muazzam yığın izlemesini sahip olduktan sonra

, sen döngüsü tanımlamak gerekir. Bu genellikle yığın izinin adreslerine bakarak oldukça kolaydır. Bu verileri aldıktan sonra, böyle yönetilen çerçeve alabilirsiniz:

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

Sonra sadece bulduğunuz döngüsünde tüm çerçeveler için aynısını yapın.

gdb here ile mono ayıklama için daha fazla ipucu vardır.