Como leer registro de bloqueo? ¿Cómo encontrar la razón por la aplicación falla en el sistema de la biblioteca? Lo que significa EXC_CRASH (SIGABRT)?

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

Pregunta

I Got un registros de errores de un cliente a la figura qué mi aplicación accidente en su iPhone.

Aquí algo de información de registro de bloqueo:

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

Seguimiento de la pila de rosca 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)
...

Aquí está el código de AccountManager.m:

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

La cuestión principal es cómo leer tales registro de bloqueo? La aplicación se bloquea en algún lugar dentro de la biblioteca del sistema, no hay información adicional más. ¿Hay alguna manera de cómo encontrar la razón del accidente?

actualización: He buscado en Google un montón de mensajes de foros, donde el tipo de excepción es EXC_CRASH (SIGABRT) y primeras líneas de una pila de subprocesos se estrelló es:

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

Lo que hace este tipo de excepción (EXC_CRASH (SIGABRT)) media?

¿Fue útil?

Solución

En primer lugar, es necesario symbolicate el registro de bloqueo mediante el DSYM para entender lo que está pasando. Usted necesita tener el archivo DSYM desde el momento en que se creó la aplicación. El archivo DSYM le permite invertir un mapa de las direcciones de memoria atrás a líneas de lectura de código.

SIGABRT es la señal que se obtiene cuando se tiene una excepción no controlada, como llamar [someArray objectAtIndex:2] si la matriz sólo tenía 1 artículo. O, más frecuentemente, un selector no reconocido:. [NSArray unsignedIntValue]

Tome un vistazo a este registro de bloqueo en esta pregunta . Tenga en cuenta que las bibliotecas de la pila de llamadas en la Fundación son los mismos que su código -. Y es un selector no reconocido

Su código es:

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

Lo que no nos ha dicho - pero es muy importante - es lo que está en "foo". ¿Cómo se asignan que NSNumber? Si se trata de cualquier otro objeto que una NSNumber, entonces su registro de bloqueo se parece a la tuya.

Si quieres ser realmente defensiva en su programación, puede decir:

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

Pero, en realidad, cualquiera que sea su "foo" está siempre deben devolver un NSNumber.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top