2010-02-23 18 views
6

मुझे एक ग्राहक से एक क्रैश लॉग मिला है कि यह पता लगाने के लिए कि मेरा ऐप उसके आईफोन पर क्यों दुर्घटनाग्रस्त हो गया है।क्रैश लॉग कैसे पढ़ा जाए? सिस्टम लाइब्रेरी में ऐप क्रैश क्यों होता है? EXC_CRASH (SIGABRT) का क्या अर्थ है?

यहाँ क्रैश लॉग से कुछ जानकारी:

 
NSNumber *number = ...; 
if (number) { 
    return [number unsignedIntegerValue]; // line 151 
} else { 
    return 0; 
} 

मुख्य सवाल यह है कि पढ़ने के लिए है: थ्रेड 0

 
Thread 0 Crashed: 
0 libSystem.B.dylib    0x3293f98c 0x328c1000 + 518540 
1 libSystem.B.dylib    0x3293f97c 0x328c1000 + 518524 
2 libSystem.B.dylib    0x3293f96e 0x328c1000 + 518510 
3 libSystem.B.dylib    0x3295461a 0x328c1000 + 603674 
4 libstdc++.6.dylib    0x30a143b0 0x309cf000 + 283568 
5 libobjc.A.dylib    0x3347a858 0x33475000 + 22616 
6 libstdc++.6.dylib    0x30a12776 0x309cf000 + 276342 
7 libstdc++.6.dylib    0x30a127ca 0x309cf000 + 276426 
8 libstdc++.6.dylib    0x30a12896 0x309cf000 + 276630 
9 libobjc.A.dylib    0x33479714 0x33475000 + 18196 
10 CoreFoundation     0x335c8210 0x33534000 + 606736 
11 CoreFoundation     0x3354ea8e 0x33534000 + 109198 
12 CoreFoundation     0x33545ab8 0x33534000 + 72376 
13 Journaler Lite     0x0001699e -[AccountManager unsignedIntegerValueForPath:] (AccountManager.m:151) 
... 

यहाँ के लिए

 
Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

स्टैक ट्रेस AccountManager.m से कोड है ऐसा क्रैश लॉग? ऐप सिस्टम लाइब्रेरी के अंदर कहीं दुर्घटनाग्रस्त हो जाता है, और कोई अतिरिक्त जानकारी नहीं। क्या कोई रास्ता है कि दुर्घटना का कारण कैसे मिलता है?

अद्यतन: मैं मंचों पदों, जहां अपवाद प्रकार एक दुर्घटनाग्रस्त धागा ढेर से EXC_CRASH (SIGABRT) और पहली लाइनों है की एक बहुत कुछ है googled है:

 
Thread 0 Crashed: 
0 libSystem.B.dylib    0x3293f98c 0x328c1000 + 518540 
1 libSystem.B.dylib    0x3293f97c 0x328c1000 + 518524 
2 libSystem.B.dylib    0x3293f96e 0x328c1000 + 518510 
3 libSystem.B.dylib    0x3295461a 0x328c1000 + 603674 
4 libstdc++.6.dylib    0x30a143b0 0x309cf000 + 283568 
5 libobjc.A.dylib    0x3347a858 0x33475000 + 22616 
6 libstdc++.6.dylib    0x30a12776 0x309cf000 + 276342 
7 libstdc++.6.dylib    0x30a127ca 0x309cf000 + 276426 
8 libstdc++.6.dylib    0x30a12896 0x309cf000 + 276630 
9 libobjc.A.dylib    0x33479714 0x33475000 + 18196 
10 CoreFoundation     0x335c8210 0x33534000 + 606736 
11 CoreFoundation     0x3354ea8e 0x33534000 + 109198 

इस अपवाद प्रकार (EXC_CRASH (SIGABRT)) क्या मतलब है?

उत्तर

5

सबसे पहले, आपको क्या हो रहा है यह समझने के लिए DSYM का उपयोग करके क्रैश लॉग का प्रतीक होना चाहिए। उस समय से आपको DSYM फ़ाइल की आवश्यकता होगी जब एप्लिकेशन बनाया गया था। डीएसवाईएम फ़ाइल आपको उन मेमोरी पतों से मानचित्र को पठनीय लाइनों पर वापस करने की अनुमति देती है।

SIGABRT सिग्नल है जो आपके पास एक अनचाहे अपवाद है, जैसे कि [someArray objectAtIndex:2] पर कॉल करना, यदि सरणी में केवल 1 आइटम था। या, अधिकतर, एक अपरिचित चयनकर्ता: [NSArray unsignedIntValue]

this question में इस क्रैश लॉग को देखें। ध्यान दें कि फाउंडेशन में कॉल स्टैक लाइब्रेरीज़ आपके कोड के समान हैं - और यह एक अपरिचित चयनकर्ता है।

आपका कोड है:

NSNumber *num = foo; 
if (num) 
{ 
    bar = [num unsignedIntValue]; 
} 

क्या आप हमें नहीं बताया है - लेकिन बहुत महत्वपूर्ण है - कि "foo" में है। आप उस NSNumber को कैसे असाइन करते हैं? यदि यह NSNumber की तुलना में कोई अन्य वस्तु है, तो आपका क्रैश लॉग आपके जैसा दिखाई देगा।

आप अपने प्रोग्रामिंग में वास्तव में बचाव की मुद्रा में बनना चाहता था, तो आप कह सकते हैं:

if (num && [num isKindOfClass:[NSNumber class]]) 

लेकिन वास्तव में, है जो कुछ भी अपने "foo" हमेशा एक NSNumber लौट जाना चाहिए।

+0

यदि आप स्टैकट्रैक/बैकट्रैक पर नज़दीक देखते हैं, तो आप देखेंगे, यह पहले ही प्रतीकात्मक है। –

+0

हां और नहीं - यह आपके कोड के लिए प्रतीक है, लेकिन आप नहीं जानते कि फाउंडेशन/आदि में क्या हो रहा है। मुझे एक और पोस्ट मिली जो आपकी मदद कर सकती है और मैंने अपना जवाब दोबारा लिखा है। – makdad

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