2015-07-18 12 views
7

मैं ऑब्जेक्टिव-सी (Xcode 6.1.1, और पार्स का उपयोग) में एक iPhone अनुप्रयोग पर काम कर रहा हूँ में एक NSInternalInconsistencyException के स्रोत का पता लगाएं, और मैं सिर्फ इस रहस्यमय NSInternalInconsistencyException मिला:कैसे एक Xcode स्टैक ट्रेस

Caught "NSInternalInconsistencyException" with reason "Tried to save an object with a pointer to a new, unsaved object.":

तो स्टैक ओवरफ़्लो समुदाय के लिए मेरे सवाल है:

कैसे किसी समस्या का वास्तविक स्रोत नीचे शिकार करने के लिए इस स्टैक ट्रेस पढ़ा है? मुझे इस स्टैक ट्रेस में कहीं भी पहचानने योग्य फ़ाइल नाम, विधि कॉल या लाइन नंबर दिखाई नहीं दे रहे हैं।

या, यदि यह केवल स्टैक ट्रेस पढ़ने की बात नहीं है, और अन्य तकनीकें शामिल हैं, तो डेवलपर को इस प्रकार की त्रुटि के स्रोत को ट्रैक करने के लिए उचित कदम क्या है?

 
2015-07-18 02:01:17.596 testapp[1276:60b] [Error]: Caught "NSInternalInconsistencyException" with reason "Tried to save an object with a pointer to a new, unsaved object.": 
(
    0 CoreFoundation      0x2f547f9b + 154 
    1 libobjc.A.dylib      0x39c94ccf objc_exception_throw + 38 
    2 CoreFoundation      0x2f547ec5 + 0 
    3 testapp        0x00205a29 -[PFObject(Private) resolveLocalId] + 384 
    4 testapp        0x00233d6d __32-[PFRESTCommand resolveLocalIds]_block_invoke + 24 
    5 testapp        0x00233783 +[PFRESTCommand forEachLocalIdIn:doBlock:] + 642 
    6 testapp        0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62 
    7 CoreFoundation      0x2f484043 + 98 
    8 CoreFoundation      0x2f483f67 + 162 
    9 testapp        0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382 
    10 testapp        0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62 
    11 CoreFoundation      0x2f484043 + 98 
    12 CoreFoundation      0x2f483f67 + 162 
    13 testapp        0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382 
    14 testapp        0x0023373f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 574 
    15 testapp        0x00233ba7 __42+[PFRESTCommand forEachLocalIdIn:doBlock:]_block_invoke + 62 
    16 CoreFoundation      0x2f484043 + 98 
    17 CoreFoundation      0x2f483f67 + 162 
    18 testapp        0x0023367f +[PFRESTCommand forEachLocalIdIn:doBlock:] + 382 
    19 testapp        0x00233ca3 -[PFRESTCommand forEachLocalId:] + 162 
    20 testapp        0x00233d3f -[PFRESTCommand resolveLocalIds] + 34 
    21 testapp        0x0023ee2f -[PFRESTCommandRunner _runCommandAsync:withCancellationToken:] + 110 
    22 testapp        0x0023e8c7 -[PFRESTCommandRunner runCommandAsync:withOptions:cancellationToken:] + 174 
    23 testapp        0x0023e7d7 -[PFRESTCommandRunner runCommandInBackground:inOperation:] + 42 
    24 testapp        0x00203667 __65+[PFObject(Private) _deepSaveAsync:withCurrentUser:sessionToken:]_block_invoke_3 + 766 
    25 testapp        0x002854b3 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke_2 + 214 
    26 libdispatch.dylib     0x3a17c833 + 10 
    27 libdispatch.dylib     0x3a183ad7 + 222 
    28 libdispatch.dylib     0x3a183d29 + 56 
    29 libsystem_pthread.dylib    0x3a2bebd3 _pthread_wqthread + 298 
    30 libsystem_pthread.dylib    0x3a2bea98 start_wqthread + 8 
). 

मैं किसी भी मदद और अंतर्दृष्टि तुम मुझे पेशकश कर सकते हैं की सराहना करते हैं:

यहाँ पूर्ण स्टैक ट्रेस कि मेरे कंसोल के लिए आउटपुट है।

उत्तर

4

यह विशेष उदाहरण डेवलपर को बहुत कुछ नहीं देता है। तो, इस मामले में आपके प्रश्न का उत्तर "Google इसे" है।

[PFObject(Private) _deepSaveAsync:withCurrentUser:sessionToken:] 

रेखा से ऊपर इंगित करता है एक currentUser का उपयोग कर बचाने में विफल रहा है, त्रुटि संदेश "एक नया, सहेजा न वस्तु के लिए एक सूचक के साथ एक वस्तु को बचाने की कोशिश के साथ संयुक्त: सच में, स्टैक ट्रेस से सबसे अच्छा सुराग रेखा है । " एक संभावित कारण को इंगित करने के लिए पर्याप्त होना चाहिए।

जैसा कि यह पता चला है, यह त्रुटि असामान्य नहीं है और परेशान है क्यों पार्स इसे ठीक नहीं करता है। आमतौर पर यह तब होता है जब आपका ऐप अज्ञात पार्स उपयोगकर्ताओं का उपयोग कर रहा है और यह सहेजे गए उपयोगकर्ता ऑब्जेक्ट से पहले ऑब्जेक्ट को सहेजने का प्रयास करता है। चूंकि उपयोगकर्ता ऑब्जेक्ट को सहेजा नहीं गया है, इसलिए इसमें objectId नहीं है और अन्य ऑब्जेक्ट की सहेजने में विफल रहता है।

समाधान यह देखने के लिए है कि currentUser ऑब्जेक्ट में objectId है, और यदि नहीं, तो पार्स को लिखने से पहले इसे पहले सहेजें।

// Prevent race condition for unsaved user 
    // Courtesy of: http://samwize.com/2014/07/15/pitfall-with-using-anonymous-user-in-parse/ 
    if ([PFUser currentUser].objectId == nil) { 
     [[PFUser currentUser] saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
      //do stuff later 
     }]; 
    } else { 
     //do stuff now 
    } 
+0

धन्यवाद। इससे मुझे सही दिशा में कदम उठाने में मदद मिली। –

2

NSInternalInconsistencyException फेंक दिया जाता है जब कोई कोड किसी ऐसे राज्य में प्रवेश करता है जिसे कभी नहीं होना चाहिए। आम तौर पर यह उन लोगों द्वारा बनाई गई बग को इंगित करता है जिन्होंने इसे लिखा है, हालांकि कभी-कभी लाइब्रेरी का गलत उपयोग करके ऐसी स्थिति का कारण बनना संभव है (उदाहरण के लिए दस्तावेज़ों के बारे में कुछ कहें)।

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

मूल डेवलपर्स को बग की रिपोर्ट करें। एक अच्छी लाइब्रेरी को कभी फेंकना नहीं चाहिए, भले ही आप इसका दुरुपयोग कर रहे हों या नहीं। जब तक वे इसे ठीक नहीं करते हैं, तब तक आप जो कुछ भी कर सकते हैं, उसे करने के लिए आप इसे अलग-अलग तरीके से करने की कोशिश कर रहे हैं। यदि आपके पास उस लाइब्रेरी के स्रोत हैं, तो आप समस्या को डीबग और ठीक करने का प्रयास कर सकते हैं।

+0

मैं, इस सवाल का जवाब की सराहना करते हैं, हालांकि मैं अभी भी पता है कि कैसे (मेरी कोड में या के पार्स) समस्याग्रस्त क्षेत्रों खोजने के लिए इस स्टैक ट्रेस पढ़ा की तरह * "कर रही है कि आप क्या करने की कोशिश कर रहे थे अपने सुझाव का पालन करने की आवश्यकता होगी कुछ अलग तरीके से "* (मुझे कैसे पता चलेगा कि कारण जानने के बिना अलग-अलग क्या करना है?), या * "यदि आपके पास उस लाइब्रेरी के स्रोत हैं, तो आप समस्या को डीबग करने और ठीक करने का प्रयास कर सकते हैं" * (मुझे कैसे पता चलेगा कि सही कोड कैसे ठीक किया जाए?)। मेरा सवाल वास्तव में "इस त्रुटि के स्रोत को खोजने के लिए क्या कदम उठाने" के बारे में है, और फिर वहां से, मैं आपकी सलाह का पालन कर सकता हूं। एक बार फिर धन्यवाद। –

+0

@IchigoKurosaki दिमाग में आने वाला एकमात्र "चरण" प्रत्येक फ्रेम के लिए स्रोत फ़ाइल नाम और रेखा संख्या प्राप्त करने के लिए स्टैक ट्रेस (उदा। 'एटोस टूल का उपयोग करके) को फिर से सिग्नल करना है। मुझे नहीं लगता कि इसके अलावा कोई भी अनौपचारिक कदम हो सकता है, क्योंकि आपका प्रश्न व्यावहारिक रूप से सामान्य है "अगर मेरे पास कोई बग है, तो मैं इसे कैसे पा सकता हूं?"। – hamstergene

+0

आपकी सलाह के लिए धन्यवाद, लेकिन मुझे लगता है कि मेरा प्रश्न "अगर मेरे पास कोई बग है, तो मुझे यह कैसे मिल सकता है?", क्योंकि मैं पूछ रहा हूं "अगर मेरे पास स्टैक ट्रेस है, तो मैं इसे कैसे पढ़ूं?" । आपके सुझाव का पहला भाग 'एटोस' टूल के साथ फिर से प्रतीकात्मक था, जो एक सहायक उत्तर की तरह लगता है। क्या आप किसी स्टैक ट्रेस से अधिक [पठनीय] विवरण प्राप्त करने के लिए इस टूल का उपयोग कैसे कर सकते हैं, इसके बारे में कुछ विवरणों के साथ उत्तर पोस्ट कर सकते हैं? क्योंकि इस तरह का उत्तर प्रश्न के लिए प्रासंगिक महसूस करेगा। किसी भी मदद की सराहना की है। –

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