English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Metodi di tracciamento di crash di iOS e dettagli di integrazione di Bugly

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!

Ti potrebbe interessare