English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Common iOS Crash Tracking Methods and Bugly Integration
When the app crashes, during the development phase, crash information can generally be tracked in the following ways
#1. Run on simulator, check xcode error log
#2. Debug on real device, check xcode error log
#3. Run on real device, check device system log
For example, let's write a piece of code that will cause a crash: crashdemo:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self performSelector:@selector(print) withObject:nil afterDelay:5]; } - (void)print { NSArray *array = @[]; NSLog(@"%@", array[1]); }
Demo#1. Run on simulator, check xcode error log
After the program execution, it will crash immediately. Open the system log of xcode to see the following error information
2016-10-29 12:13:29.015 CrashDemo[37842:7436441] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 1 beyond bounds for empty NSArray' *** Primo chiamata stack: ( 0 CoreFoundation 0x00b7ba84 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x00642e02 objc_exception_throw + 50 2 CoreFoundation 0x00b22390 __CFArrayGetTypeID_block_invoke + 0 3 CoreFoundation 0x00ac07f8 -[NSArray objectAtIndexedSubscript:] + 40 4 CrashDemo 0x000877b7 -[ViewController print] + 87 5 Foundation 0x00250d71 __NSFireDelayedPerform + 442 6 CoreFoundation 0x00acd576 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22 7 CoreFoundation 0x00accf72 __CFRunLoopDoTimer + 1250 8 CoreFoundation 0x00a8b25a __CFRunLoopRun + 2202 9 CoreFoundation 0x00a8a706 CFRunLoopRunSpecific + 470 10 CoreFoundation 0x00a8a51b CFRunLoopRunInMode + 123 11 GraphicsServices 0x041e4664 GSEventRunModal + 192 12 GraphicsServices 0x041e44a1 GSEventRun + 104 13 UIKit 0x00f0c1eb UIApplicationMain + 160 14 CrashDemo 0x00087bba main + 138 15 libdyld.dylib 0x03189a21 start + 1 ) libc++abi.dylib: terminando con eccezione non catturata di tipo NSException (lldb)
Tramite i log di Xcode possiamo vedere che c'è un superamento dei limiti dell'accesso all'array, il modo in cui è avvenuto il superamento dei limiti si chiama print
Per questo demo, chiaramente sappiamo che è l'array[1] elencato prima che ha superato i limiti, ma come possiamo verificare in quale parte di un programma completo è avvenuto il superamento dei limiti?
In questo momento possiamo utilizzare la funzione Show the breakpoint navigator di Xcode, cliccare sul plus per selezionare add exception breakpoint
In questo momento eseguiamo il programma, xcode si fermerà automaticamente alla sezione di codice che causerà il crash
Demo#2. Debugging su dispositivo reale, visualizza i log di errore di xcode
Se viene aggiunto un punto di interruzione di exeception, il programma si fermerà automaticamente alla riga di stampa array[1]. Se non viene aggiunto, il programma si avvierà e xcode mostrerà i seguenti log di errore
2016-10-29 12:15:53.561 CrashDemo[1062:316582] *** Applicazione terminata a causa di eccezione non catturata 'NSRangeException', motivo: '*** -[__NSArray0 objectAtIndex:]: index 1 oltre i limiti per NSArray vuoto' *** Primo chiamata stack: (0x211b398b 0x2094ee17 0x211433e7 0xc5a3b 0x219d1ad5 0x211765ff 0x21176231 0x2117407d 0x210c32e9 0x210c30d5 0x226b3ac9 0x257880b9 0xc5c99 0x20d6b873) libc++abi.dylib: terminando con eccezione non catturata di tipo NSException (lldb)
Tramite le informazioni di errore possiamo vedere solo che è avvenuta una violazione di accesso agli elementi dell'array, se viene aggiunto un breakpoint di exeception si fermerà automaticamente alla riga di codice con l'errore.
Demo#3. Esecuzione su dispositivo reale, visualizza i log di sistema del dispositivo
Ferma la esecuzione di crashdemo in xcode, seleziona finestra xcode - dispositivi, seleziona il telefono - visualizza log del dispositivo
Poi esegui crashdemo sul telefono, nell'elenco dei log del dispositivo ordina per data e vedrai il log di crash del crashdemo
Identificatore Incidente: 9A4C52F0-B0D7-42C9-A7CB-D4D3321D00D5 Chiave CrashReporter: 90f4d3621773443794fa73f506fd6bdef49fc269 Modello Hardware: iPhone4,1 Processo: CrashDemo [1074] Percorso: /private/var/containers/Bundle/Application/1307034E-9C2B-451F-ACD9-04C97DEC047B/CrashDemo.app/CrashDemo Identificatore: PEGA.CrashDemo Versione: 1 (1.0) Tipo di Codice: ARM (Nativo) Processo Padre: launchd [1] Data/Ora: 2016-10-29 12:21:49.49 +0800 Ora di Lancio: 2016-10-29 12:21:43.43 +0800 Versione del Sistema Operativo: iOS 9.3.1 (13E238) Versione del Rapporto: 104 Tipo di Eccezione: EXC_CRASH (SIGABRT) Codici dell'Eccezione: 0x0000000000000000, 0x0000000000000000 Nota dell'Eccezione: EXC_CORPSE_NOTIFY Attivato dal Thread: 0 Syslog filtrato: Nessuna trovata Ultima Eccezione Backtrace: 0 CoreFoundation 0x211b3986 __exceptionPreprocess + 122 1 libobjc.A.dylib 0x2094ee12 objc_exception_throw + 34 2 CoreFoundation 0x211433e2 -[__NSArray0 objectAtIndex:] + 110 3 CrashDemo 0x000e6a36 0xe0000 + 27190 4 Foundation 0x219d1ad0 __NSFireDelayedPerform + 464 5 CoreFoundation 0x211765fa
Questi possono essere implementati molto semplicemente durante la fase di sviluppo, ma cosa succede se l'app viene rilasciata e l'utente ha un crash? Di solito l'utente può solo segnalare quando è successo il crash
Poi proviamo a vedere se possiamo riprodurre l'errore, ma è inefficiente e di solito difficile riprodurre il crash dell'utente
Bugly risolve questo problema
Il SDK di Bugly invia automaticamente le informazioni di errore al server quando il programma si blocca, rendendo più facile per i developer esaminare e analizzare gli errori
Allora come si utilizza Bugly?
Prima di tutto, vai su https://bugly.qq.com/v2/ per registrare un account e registrare l'app per scaricare il pacchetto SDK
Trascina Bugly.framework nel progetto, ricordati di selezionare copy if needed.
Poi aggiungi libz.tbd / libstdc++.tbd / Security.framework / SystemConfiguration.framework al progetto
registrato in delegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [Bugly startWithAppId:@"Inserisci qui il tuo AppId"]; return YES; }
Così quando il programma si blocca, le informazioni di blocco vengono inviate automaticamente al server e puoi visualizzarle accedendo al tuo account bugly
Grazie per la lettura, spero che possa aiutarti, grazie per il supporto al nostro sito!