2012-12-03 49 views
8

My Mono application इस संदेश (Full log) के साथ मैक पर दुर्घटनाओं:ढेर अतिप्रवाह 0x26eb76, गलती addr: 0xbf808ffc

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

"अप्रबंधित में" का तात्पर्य है कि ढेर अतिप्रवाह नहीं मेरी कोड में (मैं है केवल प्रबंधित कोड है) बल्कि एक पुस्तकालय में मैं एम्बेड (SQLite, DotCmis, NewtonSoft.Json) या मोनो कोड में।

भले ही मैं डीबग मोड में संकलित और चलाता हूं, मुझे ये दो हेक्साडेसिमल मिलते हैं।

प्रश्न: मैं इस स्टैक ओवरफ़्लो की जांच कैसे कर सकता हूं? कोई चाल है?

नोट: समान पुस्तकालय (बहुत अधिक कोड के साथ) लिनक्स और विंडोज पर ठीक चलते हैं।

उत्तर

4

स्टैक ओवरफ़्लो को संभालना काफी मुश्किल है (मोनो के लिए), तो यह बहुत अच्छा हो सकता है कि स्टैक ओवरफ़्लो वास्तव में आपका है। समस्या स्टैक ट्रेस को समझने में निहित है।

मैं आमतौर पर gdb के साथ चलाएँ:

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

और फिर ढेर के बाद विकसित करने के लिए शुरू हो गया है कंट्रोल + सी हिट करने के लिए प्रयास करते हैं, लेकिन इससे पहले कि यह वास्तव में बहकर है (gdb ढेर अतिप्रवाह के साथ गंभीरता से उलझन में हो जाता है, और आप ऐसा होने पर आमतौर पर जीडीबी से बाहर निकलना होगा, यही कारण है कि आपको कार्रवाई में अतिप्रवाह पकड़ने की आवश्यकता होगी)।

Ctrl + C को मारने के बाद, thread apply all backtrace करें, और आपको पता चलेगा कि एक स्टैक ओवरफ़्लो होने वाला है (एक थ्रेड में हजारों फ्रेम होंगे)।

एक बार जब आपके पास gdb में एक विशाल स्टैक ट्रेस है, तो आपको चक्र की पहचान करने की आवश्यकता है। स्टैक ट्रेस के पते को देखकर यह आमतौर पर काफी आसान होता है। एक बार जब आप इस डेटा है, तो आप इस तरह कामयाब फ्रेम प्राप्त कर सकते हैं:

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

तो बस चक्र आप पाया में सभी फ्रेम के लिए भी ऐसा ही।

जीडीबी here के साथ मोनो डीबग करने के लिए और युक्तियां हैं।