Rendere più leggibili i crash logs di iOs con symbolicatecrash
Chiunque sviluppi su iOs si è sicuramente scontrato con la risoluzione dei crash delle proprie app, sia in fase di test ‘interno’, sia con le applicazioni già presenti in AppStore.
Tutti i dispositivi iOs salvano i log di tutti i crash, proprio per aiutare lo sviluppatore a scoprirne le cause, ma non sempre questi log sono immediatamente comprensibili.
Vediamo un esempio di crashlog per un’ipotetica applicazione MyApp :
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x313fec98 0x313fc000 + 11416
1 MyApp 0x00019c12 0x1000 + 101394
2 MyApp 0x0000a1cc 0x1000 + 37324
3 MyApp 0x0000c474 0x1000 + 46196
4 libdispatch.dylib 0x33e9d8e0 0x33e92000 + 47328
5 libdispatch.dylib 0x33e991ee 0x33e92000 + 29166
6 CoreFoundation 0x3568e934 0x35616000 + 493876
7 CoreFoundation 0x3561eebc 0x35616000 + 36540
8 CoreFoundation 0x3561edc4 0x35616000 + 36292
9 GraphicsServices 0x343cd418 0x343c9000 + 17432
10 GraphicsServices 0x343cd4c4 0x343c9000 + 17604
11 UIKit 0x3608ad62 0x3605c000 + 191842
12 UIKit 0x36088800 0x3605c000 + 182272
13 MyApp 0x000024ec 0x1000 + 5356
14 MyApp 0x000024ac 0x1000 + 5292
e qui arriva il bello: per ogni entry è presente la riga di codice dove si è presentato il problema, ma l’oggetto corrispondente viene rappresentato solamente con un codice esadecimale.
Per capire qualcosa di più ci viene in aiuto symbolicatecrash , un tool da linea di comando presente in XCode che permette di collegare i codici esadecimali alle classi corrispondenti.
Ovviamente è indispensabile archiviare ogni build che viene distribuita, in quando symbolicatecrash ha necessità tanto del log quanto della build che lo ha generato.
symbolicatecrash è prelevabile da
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
Per comodità, consiglio di creare un alias per richiamare il comando senza dover specificare ogni volta il path completo: modificate (o create, se non presente) il file .bash_profile nella vostra home directory e aggiungete al suo interno la seguente riga:
alias symbolicate="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -v"
salvate, uscite e riavviate il terminale.
Una volta configurato l’alias possiamo procedere all’interpretazione del log:
symbolicate "MyApp_2013-05-24-170900-iPhone.crash" "MyApp.app"
il comando restituirà sullo standard output il log con questo formato:
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x33b24c98 objc_msgSend + 16
1 MyApp 0x00019c12 -[TwoLineNavBarTitleView setLine2:]
(TwoLineNavBarTitleView.m:43)
2 MyApp 0x0000a1cc -[ListViewController
listModelDidFinishQueryingForRadius:]
(ListViewController.m:160)
3 MyApp 0x0000c474 __45-[ListViewModel
filterParksBasedOnCategories]
(ListViewModel.m:129)
4 libdispatch.dylib 0x33d108e0 _dispatch_call_block_and_release + 4
5 libdispatch.dylib 0x33d0c1ee _dispatch_main_queue_callback + 306
6 CoreFoundation 0x3039f934 __CFRunLoopRun + 1328
7 CoreFoundation 0x3032febc CFRunLoopRunSpecific + 224
8 CoreFoundation 0x3032fdc4 CFRunLoopRunInMode + 52
9 GraphicsServices 0x35571418 GSEventRunModal + 108
10 GraphicsServices 0x355714c4 GSEventRun + 56
11 UIKit 0x358c7d62 -[UIApplication _run] + 398
12 UIKit 0x358c5800 UIApplicationMain + 664
13 MyApp 0x000024ec main (main.m:14)
14 MyApp 0x000024ac 0x1000 + 5292
sicuramente molto più comprensibile!
via