2011-02-23 11 views
7

मेरे पास कुछ ऐसा है जो मैंने पहले नहीं देखा है। इन धागों में फ्रेम 2 देखें:।दो थ्रेड में एक साथ abort()

Thread 31 (process 8752): 
#0 0x00faa410 in __kernel_vsyscall() 
#1 0x00b0b139 in sigprocmask() from /lib/libc.so.6 
#2 0x00b0c7a2 in abort() from /lib/libc.so.6 
#3 0x00752aa0 in __gnu_cxx::__verbose_terminate_handler() from /usr/lib/libstdc++.so.6 
#4 0x00750505 in ??() from /usr/lib/libstdc++.so.6 
#5 0x00750542 in std::terminate() from /usr/lib/libstdc++.so.6 
#6 0x00750c65 in __cxa_pure_virtual() from /usr/lib/libstdc++.so.6 
#7 0x00299c63 in ApplicationFunction() 

Thread 1 (process 8749): 
#0 0x00faa410 in __kernel_vsyscall() 
#1 0x00b0ad80 in raise() from /lib/libc.so.6 
#2 0x00b0c691 in abort() from /lib/libc.so.6 
#3 0x00b4324b in __libc_message() from /lib/libc.so.6 
#4 0x00b495b6 in malloc_consolidate() from /lib/libc.so.6 
#5 0x00b4b3bd in _int_malloc() from /lib/libc.so.6 
#6 0x00b4d3ab in malloc() from /lib/libc.so.6 
#7 0x08147f03 in AnotherApplicationFunction() 

जब gdb के साथ इसे खोलने और पश्व-अनुरेखन यह मेरे थ्रेड 1. बाद में मैंने अजीब राज्य कि धागा 31 में है देखा देता हो रही यह धागा पुस्तकालय है कि हम समस्या नहीं थी से है इसलिए मुझे विश्वास होगा कि दुर्घटना इसके कारण होती है।

तो इसका क्या अर्थ है? दो थ्रेड एक साथ कुछ अवैध कर रहे हैं? या यह उनमें से एक है, किसी अन्य तरह से abort() दूसरे में?

ओएस लिनक्स Red Hat Enterprise 5.3 है, यह एक मल्टीप्रोसेसर सर्वर है।

+1

आप लिनक्स पर हैं, आप केवल वालग्रिंड क्यों नहीं चलाते (विशेष रूप से memcheck, helgrind और DRD मॉड्यूल)? –

+0

धन्यवाद, मैं उनके साथ जांच करूंगा। यह एक जटिल कार्यक्रम है और वाल्ग्रिंड आमतौर पर बहुत सारी चीज़ें देता है, लेकिन मैं कुछ पृथक भागों का विश्लेषण करने की कोशिश करूंगा –

उत्तर

3

ऐसा लगता है कि ढेर भ्रष्टाचार, धागा 1 में malloc द्वारा पता लगाया जा सकता है, सूत्र में कारण या वजह से त्रुटि से 31.

कोड अधिलेखन ए.ओ. से ​​कुछ टूटा हुआ टुकड़ा 31 धागे में vtable आसानी से इसका कारण बन सकता है।

4

यह सुनिश्चित करना मुश्किल है, लेकिन इन स्टैक निशानों को देखने पर मेरा पहला संदेह एक स्मृति भ्रष्टाचार होगा (संभवतः ढेर पर एक बफर ओवररन)। यदि ऐसा है, तो भ्रष्टाचार शायद abort में समाप्त होने वाले दोनों धागे का मूल कारण है।

क्या आप valgrind अपना ऐप कर सकते हैं?

+0

हां, मैं valgrind के साथ जांच करूंगा –

3

यह संभव है कि थ्रेड 31 को निरस्त करने का कारण यह है क्योंकि यह किसी भी तरह से एप्लिकेशन ढेर को मिटा देता है। फिर जब मुख्य धागे ने स्मृति आवंटित करने की कोशिश की तो ढेर डेटा संरचना खराब स्थिति में थी, जिससे आवंटन विफल हो गया और एप्लिकेशन को दोबारा रद्द कर दिया गया।

संबंधित मुद्दे