كيف تقرأ سجل Crash؟ كيف تجد لماذا يتعطل التطبيق في مكتبة النظام؟ ماذا يعني exc_crash (sigabrt)؟

StackOverflow https://stackoverflow.com/questions/2322198

سؤال

حصلت على سجلات تصادم من عميل لمعرفة سبب تحطم تطبيقي على 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" الخاص بك يجب أن يعيد دائمًا عابر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top