كيف تقرأ سجل Crash؟ كيف تجد لماذا يتعطل التطبيق في مكتبة النظام؟ ماذا يعني exc_crash (sigabrt)؟
سؤال
حصلت على سجلات تصادم من عميل لمعرفة سبب تحطم تطبيقي على iPhone الخاص بها.
هنا بعض المعلومات من سجل Crash:
Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x00000000, 0x00000000 Crashed Thread: 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) ...
هنا رمز من AccountManager.m
:
NSNumber *number = ...; if (number) { return [number unsignedIntegerValue]; // line 151 } else { return 0; }
والسؤال الرئيسي هو كيفية قراءة سجل التعطل هذا؟ يتعطل التطبيق في مكان ما داخل مكتبة النظام ، ولا مزيد من المعلومات الإضافية. هل هناك ما يمكن أن تجد سبب تحطم؟
تحديث:لقد غوغل الكثير من منشورات المنتديات ، حيث يكون نوع الاستثناء EXC_CRASH (SIGABRT)
والخطوط الأولى من مكدس الخيط المحطم هو:
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)
) تعني؟
المحلول
أولاً ، تحتاج إلى رمز سجل التحطم باستخدام DSYM لفهم ما يحدث. ستحتاج إلى الحصول على ملف DSYM من وقت بناء التطبيق. يتيح لك ملف DSYM عكس الخريطة من عناوين الذاكرة هذه إلى خطوط رمز قابلة للقراءة.
SIGABRT هي الإشارة التي تحصل عليها عندما يكون لديك استثناء غير معقول ، مثل الاتصال [someArray objectAtIndex:2]
إذا كان الصفيف لديه عنصر واحد فقط. أو ، في كثير من الأحيان ، محدد غير معترف به: [NSArray unsignedIntValue]
.
ألقِ نظرة على تسجيل الدخول هذا الحادث هذا السؤال. لاحظ أن مكتبات مكدس المكالمات في المؤسسة هي نفس الكود الخاص بك - وهو محدد غير معترف به.
رمزك هو:
NSNumber *num = foo;
if (num)
{
bar = [num unsignedIntValue];
}
ما لم تخبرنا به - ولكنه مهم للغاية - هو ما يوجد في "فو". كيف يمكنك تعيين هذا nsnumber؟ إذا كان أي كائن آخر غير NSNumber ، فسيبدو سجل التعطل الخاص بك مثلك.
إذا أردت أن تكون دفاعيًا حقًا في برمجةك ، يمكنك القول:
if (num && [num isKindOfClass:[NSNumber class]])
ولكن في الحقيقة ، مهما كان "Foo" الخاص بك يجب أن يعيد دائمًا عابر.