2016-03-31 34 views
11

In Objective-C, lo NSSetUncaughtExceptionHandler può registrare alcune funzionalità per eseguire alcune registrazioni dell'ultimo minuto sull'eccezione.Come catturare un crash di Swift e fare un po 'di registrazione

Questo non cattura qualcosa che va in crash da Swift.

È possibile fare qualcosa di simile a livello globale in Swift? Per esempio. fare un po 'di logging se si verifica un arresto anomalo nel codice Swift, come lo scartamento forzato a zero opzionale.

In particolare, eseguo un'utilità per registrare il traffico di rete nell'app e vorrei scaricare i dati in memoria sul disco in caso di arresto anomalo.

+0

Penso che forse Apple non ha funzionato per questo, proprio come Refactor. – Lumialxk

risposta

1

ci sono molteplici aspetti alle vostre domande, vorrei provare a rispondere:

  1. NSSetUncaughtExceptionHandler cattura solo le eccezioni non gestite fanno, che è solo un piccolo sottoinsieme di possibili incidenti.
  2. Le eccezioni in Objective-C sono definite come fatali e non è consigliabile catturarle e ancora più sconsigliato eseguire qualsiasi codice di sicurezza asincrono, che include qualsiasi codice Objective-C e Swift
  3. Per catturare gli arresti anomali è necessario impostare i gestori di segnale e quindi eseguire solo codice async-safe al momento del crash, che è solo un piccolo sottoinsieme di C. Soprattutto non si può allocare nuova memoria in caso di crash time.
  4. Ricorda che quando l'app si arresta in modo anomalo si trova in un codice altamente instabile e gli oggetti oi riferimenti alle variabili possono indicare qualcosa di completamente inaspettato. Quindi non dovresti davvero fare nulla durante il periodo di crash.
  5. Il miglior metodo open source per gestire gli arresti anomali sta utilizzando PLCrashReporter, che fornisce anche il metodo per richiamare il codice in caso di arresto anomalo. Ma ancora, questo deve essere async-safe.

Per il tuo scenario specifico: non dovresti farlo e non provare a farlo. Ciò potrebbe causare il danneggiamento dei dati dell'utente o la perdita di altri dati. L'app si è bloccata duramente con problemi seri, piuttosto risolvere il problema.

-1
NSSetUncaughtExceptionHandler(&HandleException); 
signal(SIGABRT, SignalHandler); 
signal(SIGILL, SignalHandler); 
signal(SIGSEGV, SignalHandler); 
signal(SIGFPE, SignalHandler); 
signal(SIGBUS, SignalHandler); 
signal(SIGPIPE, SignalHandler); 

Questo funzionerà per la maggior parte delle situazioni. Ma sto anche cercando di trovare un modo per catturare tutti gli arresti anomali. Bene, se si fa clic + su questi segnali per vedere i documenti, si troverà che ci sono più di 20 tipi di segnali, quello che ho fatto è il segnale (,) tutti i più di tutti i tipi di segnali. Sembra funzionare, ma forse ancora qualche incidente non può essere raccolto.

5

NSSetUncaughtExceptionHandler funziona solo con NSExceptions. Vedere la risposta this SO per una spiegazione brillante.

Per rilevare gli errori del tempo di esecuzione di Swift, implementare il gestore di segnale per SIGTRAP. Per quanto ne so, il codice Swift terminerà il programma con il tipo di eccezione SIGTRAP se rileva una condizione imprevista durante il runtime, solo SIGTRAP è utile per rilevare gli errori di Swift, il resto come SIGSEGV, SIGBUS, SIGILL non funziona. Ho trovato queste informazioni nel collegamento this apple.

Se il codice è un mix sia di Objective-C e Swift, quindi implementare sia NSSetUncaughtExceptionHandler e gestore di segnale per gestire gli arresti anomali.

Per la comprensione e l'implementazione della gestione dei segnali, fare riferimento al collegamento this.

Spero che questo aiuti.

+2

Ho aggiunto un gestore di segnali per la maggior parte dei segnali ('SIGTRAP' incluso), tuttavia non gestisce" errore fatale: inaspettatamente trovato nil mentre scartando un valore Opzionale ". Ho anche aggiunto un gestore di eccezioni con 'NSSetUncaughtExceptionHandler()' ... –