Come leggere il registro degli arresti anomali?Come scoprire perché l'app si blocca nella libreria di sistema?Cosa significa EXC_CRASH (SIGABRT)?

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

Domanda

Ho ricevuto un registro degli arresti anomali da un cliente per capire perché la mia app si è bloccata sul suo iPhone.

Ecco alcune informazioni dal registro degli arresti anomali:

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

Analisi dello stack per il thread 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)
...

Ecco il codice da AccountManager.m:

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

La domanda principale è: come leggere questo registro degli arresti anomali?L'app si blocca da qualche parte nella libreria di sistema, senza più informazioni aggiuntive.C'è un modo per trovare il motivo dell'incidente?

aggiornamento:Ho cercato su Google molti post dei forum, dove si trova il tipo di eccezione EXC_CRASH (SIGABRT) e le prime righe di uno stack di thread bloccato sono:

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

Che cosa significa questa eccezione di tipo (EXC_CRASH (SIGABRT)) Significare?

È stato utile?

Soluzione

Innanzitutto, devi simbolizzare il registro degli arresti anomali utilizzando DSYM per capire cosa sta succedendo.Sarà necessario disporre del file DSYM dal momento in cui è stata creata l'applicazione.Il file DSYM consente di invertire la mappatura da quegli indirizzi di memoria a righe di codice leggibili.

SIGABRT è il segnale che ricevi quando si verifica un'eccezione non gestita, come una chiamata [someArray objectAtIndex:2] se l'array avesse solo 1 elemento.O, più spesso, un selettore non riconosciuto: [NSArray unsignedIntValue].

Dai un'occhiata a questo accesso anomalo questa domanda.Tieni presente che le librerie dello stack di chiamate in Foundation sono le stesse del tuo codice ed è un selettore non riconosciuto.

Il tuo codice è:

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

Ciò che non ci hai detto, ma è molto importante, è ciò che c'è in "foo".Come si assegna quel NSNumber?Se si tratta di un oggetto diverso da un NSNumber, il registro degli arresti anomali sarà simile al tuo.

Se vuoi essere VERAMENTE difensivo nella tua programmazione, puoi dire:

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

Ma in realtà, qualunque sia il tuo "foo" dovrebbe sempre restituire un NSNumber.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top