Comment lire le journal des blocages? Comment trouver pourquoi l'application se bloque dans la bibliothèque système? Que signifie EXC_CRASH (SIGABRT)?

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

Question

Je suis un crash logs d'un client de comprendre pourquoi mon accident d'application sur son iPhone.

Voici quelques informations du journal de plantage:

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

trace de pile pour fil 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)
...

Voici le code de AccountManager.m:

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

La principale question est de savoir comment lire ce journal des blocages? L'application se bloque quelque part dans la bibliothèque système, pas d'info plus supplémentaire. Est-il possible comment trouver la raison de l'accident?

Mise à jour: J'ai googlé beaucoup de messages de forums, où le type d'exception est EXC_CRASH (SIGABRT) et premières lignes d'une pile de fil est écrasé:

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

Qu'est-ce que ce type d'exception (EXC_CRASH (SIGABRT)) signifie?

Était-ce utile?

La solution

D'abord, vous devez symbolicate le journal des blocages à l'aide du DSYM pour comprendre ce qui se passe. Vous aurez besoin d'avoir le fichier DSYM à partir du moment où la demande a été construite. Le fichier DSYM permet d'inverser la carte de ceux adresses mémoire lisibles à des lignes de retour de code.

SIGABRT est le signal que vous obtenez lorsque vous avez une exception non gérée, comme appeler [someArray objectAtIndex:2] si le tableau avait seulement 1 point. Ou, plus souvent, un sélecteur non reconnu. [NSArray unsignedIntValue]

Jetez un oeil à ce journal de plantage cette question. Notez que les bibliothèques de la pile d'appel à la Fondation sont les mêmes que votre code -. Et il est un sélecteur non reconnu

Votre code est:

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

Ce que vous ne nous avez pas dit - mais il est très important - est ce qui est dans « foo ». Comment attribuez-vous que NSNumber? Si elle est tout autre objet que d'un NSNumber, votre journal de plantage ressemblera le vôtre.

Si vous voulez être vraiment défensive dans votre programmation, vous pouvez dire:

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

Mais vraiment, quel que soit votre "foo" est doit toujours être un retour NSNumber.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top