Как читать журнал аварий? Как найти причину сбоя приложения в системной библиотеке? Что значит EXC_CRASH (SIGABRT)? - PullRequest
6 голосов
/ 24 февраля 2010

Я получил журналы сбоев от покупателя, чтобы понять, почему мое приложение зависло на ее iPhone.

Вот некоторая информация из журнала аварий:

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))?

1 Ответ

5 голосов
/ 28 ноября 2010

Во-первых, вам нужно обозначить журнал сбоев, используя DSYM, чтобы понять, что происходит.Вам потребуется файл DSYM с момента создания приложения.Файл DSYM позволяет вам преобразовать карту с этих адресов памяти обратно в читаемые строки кода.

SIGABRT - это сигнал, который вы получаете, когда у вас есть необработанное исключение, такое как вызов [someArray objectAtIndex:2], если массив имел только1 предметИли, чаще, нераспознанный селектор: [NSArray unsignedIntValue].

Взгляните на этот журнал сбоев в этот вопрос .Обратите внимание, что библиотеки стека вызовов в Foundation совпадают с вашим кодом - и это нераспознанный селектор.

Ваш код:

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

То, что вы нам не сказали, - ноочень важно - это то, что находится в «фу».Как вы назначаете этот NSNumber?Если это какой-либо другой объект, кроме NSNumber, то ваш журнал сбоев будет выглядеть как ваш.

Если вы хотите ДЕЙСТВИТЕЛЬНО защищаться в своих программах, вы можете сказать:

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

Нодействительно, каким бы ни был ваш "foo", он всегда должен возвращать NSNumber.

...