मालकॉक "डबल फ्री" त्रुटि का कारण कैसे पता करें?


80

मैं ऑब्जेक्टिव-सी में एक एप्लिकेशन प्रोग्रामिंग कर रहा हूं और मुझे यह त्रुटि मिल रही है:

MyApp (2121,0xb0185000) मॉलोक: *** ऑब्जेक्ट 0x1068310 के लिए त्रुटि: डबल फ्री
*** ने डीबग करने के लिए malloc_error_break में एक ब्रेकप्वाइंट सेट किया

यह तब हो रहा है जब मैं एक NSAutoreleasePool जारी करता हूं और मैं यह पता नहीं लगा सकता कि मैं किस वस्तु को दो बार जारी कर रहा हूं।

मैं उसका विराम बिंदु कैसे निर्धारित करूं?

क्या यह जानने का कोई तरीका है कि यह "ऑब्जेक्ट 0x1068310" क्या है?


4
आप iPhone के साथ-साथ कुछ और लोगों को पाने के लिए इस पोस्ट को टैग करना चाह सकते हैं
बेनी वोंग

4
अन्य अधिक प्रासंगिक टैग के पक्ष में "iphone" टैग हटा दिया गया।
क्विन टेलर

3
मैं सोच भी नहीं सकता कि यह iPhone प्रश्न iPhone टैग को क्यों याद कर रहा है। "ऑटोरेलिज़" जैसे कुछ अन्य टैगों की तुलना में "iPhone" के बाद अधिक लोग होने चाहिए। यदि आप "ऑटोरेलिज़" खोजना चाहते हैं, तो आप इसके लिए खोज करते हैं, आप टैग का अनुसरण नहीं करते हैं। इसलिए मैंने "iPhone" वापस रखा।
नोसरेडना

6
कारण मैंने "iphone" टैग को हटा दिया क्योंकि प्रश्न के बारे में कुछ भी iPhone के लिए विशिष्ट नहीं है। सभी लिंक केवल यह है कि यह एक iPhone ऐप में होता है, लेकिन सटीक वही त्रुटि किसी भी C या ऑब्जेक्टिव-सी एप्लिकेशन में हो सकती है। मुझे उम्मीद नहीं है कि iPhone का अनुसरण करने वाले लोग लापरवाही से इसमें रुचि लेंगे - बल्कि, यह ऐसे लोग होंगे जो "डबल फ्री" या "malloc_error_break" जैसी चीजों की खोज करेंगे, और अगर वे "iPhone" में टॉस करेंगे, तो यह अभी भी आएगा। । आइए टैग के बारे में परेशान न हों, लेकिन विचार करें कि शायद जवाब देने वाले लोग यह जान सकते हैं कि सवाल सबसे अच्छा कहां है।
क्विन टेलर

3
यह सवाल कम से कम कोको-विशिष्ट है। यदि iPhone टैग बंद हो जाता है, तो कोको टैग के बारे में कैसे? स्पष्ट इरादा एक्सकोड में कोको पर उद्देश्य-सी पर लागू होता है। विंडोज, या लिनक्स पर या एक्सकोड के संदर्भ के बाहर उद्देश्य-सी नहीं।
रनको

जवाबों:


38

आपको पता चलेगा कि जब आप डिबगर में तोड़ते हैं तो वह वस्तु क्या होती है। बस कॉल स्टैक को देखें और आप पाएंगे कि आप इसे कहाँ मुक्त करते हैं। यह आपको बताएगा कि यह कौन सी वस्तु है।

ब्रेकपॉइंट सेट करने का सबसे आसान तरीका है:

  1. रन -> शो -> ब्रेकपॉइंट ( ALT- Command- B) पर जाएं
  2. सूची के नीचे स्क्रॉल करें और प्रतीक जोड़ें malloc_error_break

1
मैंने कोशिश की कि, लेकिन मुझे मिलता है: Malloc_error_break को भंग करने में असमर्थ .... इसका क्या मतलब है?
गोनसो

3
ऑटोरेलिज डबल फ्री के लिए कोई मदद नहीं। उसे लाश की जरूरत है
Rog

58
@ आंगन - बस उत्सुक, अगर यह आपके लिए काम नहीं करता था, तो आपने इसे उत्तर के रूप में क्यों स्वीकार किया?
क्विन टेलर

8
Xcode 4.3.2 में, ब्रेकप्वाइंट व्यू → नेविगेटर → शो ब्रेकप्वाइंट्स नेविगेटर या m6 (सीएमडी -6) में पाया जा सकता है
एंड्रियास ले

46

जब कोई ऑब्जेक्ट "डबल-फ़्री" होता है, तो सबसे आम कारण यह है कि आप (अनावश्यक रूप से) एक ऑटोरेल्ड ऑब्जेक्ट जारी कर रहे हैं, और यह बाद में ऑटोरेलिज्ड होता है जब युक्त ऑटोरेलिज़ पूल खाली हो जाता है।

मैंने पाया है कि अतिरिक्त रिलीज को ट्रैक करने का सबसे अच्छा तरीका है, एक्सकोड में प्रभावित निष्पादन योग्य के लिए NSZombieEnabled पर्यावरण चर का उपयोग करना । इसका उपयोग करने के त्वरित तरीके के लिए, इस CocoaDev विकी पृष्ठ को देखें । (इस पृष्ठ के अलावा, Apple ने Xcode में कोड डिबगिंग के लिए कुछ अविश्वसनीय रूप से अस्पष्ट अभी तक उपयोगी युक्तियों का दस्तावेजीकरण किया है, जिनमें से कुछ ने कुछ समय से अधिक समय तक मेरे बेकन को बचाया है। मेरा सुझाव है कि इस तकनीकी नोट को developer.apple.com - लिंक पर देखें। कोको के फाउंडेशन ढांचे पर अनुभाग में कूदता है)।

संपादित करें: आप अक्सर Xcode डिबगर के भीतर आपत्तिजनक वस्तु को ट्रैक कर सकते हैं, लेकिन यदि आप आपकी सहायता के लिए इंस्ट्रूमेंट्स का उपयोग करते हैं तो यह अक्सर बहुत आसान होता है। Xcode से, चलाएँ → प्रदर्शन उपकरण के साथ प्रारंभ करें → ऑब्जेक्ट आवंटन और आपको उस ऑब्जेक्ट को वापस करने के लिए सक्षम होना चाहिए जहाँ इसे बनाया गया था। (यह सबसे अच्छा काम करेगा यदि आप ऊपर चर्चा की गई लाश के रूप में सक्षम हैं।) नोट: स्नो लेपर्ड इंस्ट्रूमेंट्स में एक लाश उपकरण जोड़ता है, जो रन मेनू से भी सुलभ है। $ 29 के लायक अकेले हो सकता है! ;-)

यहाँ एक संबंधित SO प्रश्न भी है


1
CocoaDev विकी पेज उत्तर में लिंक मृत है :(
देवर्षि

वे बैक मशीन का उपयोग करें: web.archive.org/web/20120325135712/http://www.cocoadev.com/…
क्विन टेलर

12

मैं सिर्फ क्विन टेलर के जवाब के अलावा अपने अनुभव को जोड़ना चाहता हूं।

मेरे एक ऐप में, मुझे डेटा को कोर डेटा ऑब्जेक्ट में पार्स करना और सहेजना है और बाद में इन ऑब्जेक्ट्स को विचारों पर प्रदर्शित करने के लिए प्राप्त करना है। वास्तव में, ऐप ठीक काम करता है और बिल्कुल भी क्रैश नहीं करता है, जब तक कि मैंने कई बार आगे और पीछे नेविगेट करने का तनाव परीक्षण करने की कोशिश नहीं की, जितनी जल्दी हो सके कई विचारों को खोलने की कोशिश की। उपरोक्त संदेश के साथ ऐप क्रैश हो जाता है।

मैंने उन सभी तरीकों की कोशिश की है जो क्विन ने अपने जवाब में सुझाए थे और अभी भी यह पता लगाने में विफल रहे कि सटीक कारण कहां था।

मैंने NSZombieEnabled = YES, और NSStackLogging = YES सेट किया, पता लगाने के लिए कमांड शेल malloc_history चला, लेकिन फिर भी कोई भाग्य नहीं। यह हमेशा इंगित करता है कि जहां मैं डेटा को कोर डेटा ऑब्जेक्ट में सहेजता हूं, वास्तव में, मैंने वहां जारी की गई वस्तुओं पर हजार गुना जांच की है, कुछ भी अजीब नहीं है।

विभिन्न उपकरणों (एलोकेशन, लीक्स, आदि ...) के साथ इंस्ट्रूमेंट्स में चलने से अभी भी मदद नहीं मिली। गार्ड मैलोक सक्षम करें फिर भी कुछ नहीं मिला।

अंतिम बचाव: मैंने उन विचारों पर वापस आने की कोशिश की जहां ऑब्जेक्ट्स को कोर डेटा से लिया गया था और इन सभी वस्तुओं को एक रिटेन संदेश भेजा था, और इन परिवर्तनों पर ध्यान दिया। इसने इस मुद्दे को हल कर दिया !!!

इसलिए, मुझे पता चला कि मैं एक को बनाए रखने में विफल रहा, यही कारण है। बस मेरा अनुभव साझा करना चाहते हैं ताकि आपके पास अपने ऐप के लिए एक और बचाव हो।


9

Cmd + Shift + R दबाकर डीबगर कंसोल को खोलें। वहां, टाइप करें

break malloc_error_break

malloc_error_breakफ़ंक्शन की शुरुआत में एक ब्रेकपॉइंट सेट करने के लिए ।

यदि आप यह जानना चाहते हैं कि पता 0x1068310 पर स्थित है, तो आप डीबगर कंसोल में निम्नलिखित टाइप कर सकते हैं:

print-object 0x1068310

बेशक, आपको यह करना होगा जब ऑब्जेक्ट अभी भी जीवित है - यदि आप ऑब्जेक्ट को ऐसा करने से पहले ही मुक्त कर चुके हैं, तो यह काम नहीं करेगा।


यह ऑटोरेलिज है, उसे लाश की जरूरत है।
रोज

1
अंत में मैंने जो किया वह ऑटोरेलिजपॉल के बाहर "संदिग्ध" पद्धति को लागू कर रहा था। मजेदार सोचा कि मुझे अभी भी चेतावनी मिली है, लेकिन कोई ब्रेक प्वाइंट हिट नहीं हुआ। मैंने तब तक ब्लॉक पर टिप्पणी की जब तक मुझे रेखा नहीं मिल गई। मैं एक स्ट्रिंग को स्वायत्त कर रहा था जिसे stringWithFormat (कोई आवंटन या प्रतिलिपि नहीं) के साथ बनाया गया था। आपके सुझावों के लिए आप सभी का धन्यवाद! गोंसो
गोनसो

इस विशेष प्रकार के बग के लिए, malloc_error_break पर टूटने से कभी भी समस्या का पता लगाने में मदद नहीं मिली है - इसे हमेशा सक्षम करने वाली लाश की आवश्यकता होती है।
क्विन टेलर

XCode 4 में malloc_error_break के लिए एक ब्रेकप्वाइंट सेट करने के निर्देशों के लिए यहां देखें: stackoverflow.com/questions/6969407/…
benvolioT

1
@ ज़म्बी: poउपनाम का उपयोग करने की कोशिश करें , या समकक्ष expr -o। मूल रूप से यह उत्तर लिखे जाने के बाद के वर्षों में, Xcode द्वारा उपयोग किए जाने वाले डीबगिंग इंजन को GDB से LLDB में बदल दिया गया है, और LLDB के पास आदेशों का एक अलग सेट है।
एडम रोसेनफील्ड

4

मेरे लिए यह मुद्दा हल हो गया था

(gdb) call (void)_CFAutoreleasePoolPrintPools()

दुर्घटना के तुरंत बाद। स्टैक के शीर्ष पर पता अपराधी का पता था। एक retainऔर आवाज में फेंक दिया ।

लॉग संदेश में दिया गया पता मुझे कहीं नहीं मिला। यह कभी भी किसी भी तरह के विभिन्न इंस्ट्रूमेंट्स में नहीं दिखा। जाहिरा तौर पर कुछ आंतरिक डेटा के लिए एक संकेतक जो पहले से ही मुक्त हो गया था।


4

Xcode 4 में एक प्रतीकात्मक विराम बिंदु जोड़ना

Xcode 4 के लिए इसे प्रासंगिक बनाने के लिए बस एक अपडेट ...

से Xcode 4 उपयोगकर्ता गाइड :

एक प्रतीकात्मक विराम बिंदु जोड़ने के लिए। । ।

  1. ब्रेकपॉइंट नेविगेटर के निचले-बाएँ कोने में, जोड़ें बटन पर क्लिक करें।
  2. Add Symbolic Breakpoint चुनें।
  3. सिंबल फ़ील्ड में प्रतीक नाम दर्ज करें।
  4. पूरा किया क्लिक करें।


2

अपनी कक्षाओं की जाँच करें और डीलॉक विधि के तहत देखें। सुनिश्चित करें कि आप कॉल करने का ध्यान रखते हैं[super dealloc].

मेरे पास यह एक ही समस्या थी और मुझे पता चला कि मैं [self dealloc]इसके बजाय कॉल कर रहा था । बस ध्यान नहीं दे रही है।


2

कृपया उस ऑब्जेक्ट को खोजने के लिए नीचे दिए गए चरणों को खोजें जो मुफ़्त है और एप्लिकेशन को क्रैश करता है।

1) " ब्रेकप्वाइंट नेविगेटर " पर क्लिक करें ।
2) फिर " + " बटन पर क्लिक करें जो नीचे है।
3) सूची से " प्रतीकात्मक विराम बिंदु ... " जोड़ें ।
4) " प्रतीक " विकल्प पर " malloc_error_break " कीवर्ड जोड़ें ।

या आप नीचे दी गई GIF प्रस्तुति को भी देख सकते हैं।

जीआईएफ पुनःपूर्ति


1

यह आमतौर पर कुछ निरीक्षक, जैसे सफारी या सफारी पूर्वावलोकन के कारण होता है। पोस्ट या पोस्ट और प्रश्न का संदर्भ लें ।

AutoMively शो वेब का चयन निकालें ...., इस समस्या को दूर करेगा।

ध्यान दें, बस नज़दीकी सफारी या सफारी पूर्वावलोकन इस समस्या को दूर नहीं करेगा। और आपको सफारी और सफारी दोनों का पूर्वावलोकन रद्द करना होगा।

यदि यह नहीं होगा, तो इस उत्तर को देखें या इसे डीबग करने के लिए पोस्ट करें।

deselect स्वचालित रूप से सफारी पूर्वावलोकन पर निरीक्षण करता है


0

Xcode में, विराम बिंदु सेट करने के लिए पंक्ति संख्या के बाईं ओर क्लिक करें। फिर आप इसे "बिल्ड और डीबग" करके लॉन्च कर सकते हैं।

यह सलाह दी जाती है कि आप उस वस्तु का निर्माण न करें, autoreleaseजो आईफ़ोन में मेमोरी है। Apple स्पष्ट रूप से कॉल करने की सलाह देता है release


0

इस प्रकार की मेमोरी और पॉइंटर समस्याओं को सामान्य रूप से जानने के लिए, आप अपना कोड वेलग्राइंड जैसे रनटाइम मेमोरी एरर चेकर के खिलाफ चलाना चाहते हैं । यह उन चीजों को इंगित करने में सक्षम होना चाहिए जो आपका कोड गलत कर रहे हैं, इससे परे जो इसे दुर्घटना का कारण बनाते हैं।

Valgrind OSX पर काम कर सकता है (हालांकि यह कहता है कि यह "असमर्थित और अपूर्ण और छोटी गाड़ी है"), और थोड़े हैकिंग के साथ किसी ने इसे iPhone SDK निष्पादक पर काम करने के लिए मिला ।

इससे भी बेहतर आप इंस्ट्रूमेंट्स ट्राई कर सकते हैं, जो XCode का हिस्सा है। यहाँ इसे चलाने के लिए एक ट्यूटोरियल है


1
उपकरण जाने का रास्ता है; ऑब्जेक्ट एलोकेशन इंस्ट्रूमेंट का उपयोग करें और लाश चालू करें। (या सिर्फ लाश टेम्पलेट का उपयोग करें)। Valgrind अंतिम उपाय का समाधान है। यह बहुत धीमा है और अक्सर बस काम नहीं करेगा।
बीबी जुम

0

अगर malloc_error_breakमदद नहीं कर रहा है ...

इस त्रुटि को हल करने के लिए सबसे अच्छा तरीका है चलाने के लिए है उपकरणों के साथ NSZombiesचालू कर दिया। जब इंस्ट्रूमेंट गड़बड़ हो जाएगा और इंस्ट्रूमेंट्स कोड की लाइन में सीधे ट्रेस कर सकते हैं, तब आप इसे फ्लैग करेंगे।

हिम तेंदुए की आवश्यकता, क्या एक जीवन रक्षा हालांकि!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.