一直以來我都只看IDE中的crash log,沒想到這次要查看蘋果審查委員給的crash log檔案,這時候麻煩可大了,如果沒有弄清楚crash在哪,審委是不會讓我上架的⋯⋯看了它給的檔案,僅知道是IAP(應用內購買)程序有問題,儘管我怎麼測都沒有發生過!之後我陸續送了兩個版本,審委依然給我同樣的回覆,讓我不得不去找辦法轉譯crash log檔!
很幸運地我總算學會SymbolicateCrash來分析崩潰紀錄啦~
使用目的
有天我們想要研究Crash Log,也就是.crash檔,來修正bug,但是內容沒有轉譯完全,所以不知道是哪個view controller或method發生問題。舉例⋯⋯
原始:
0 GarbageGuard 0x000000010008adf4 0x100040000 + 306676
想要:
0 GarbageGuard 0x000000010008adf4 -[IAPHelper productsRequest:didReceiveResponse:] (IAPHelper.m:76)
原始內容中有沒啥特別意義的位址碼和偏移碼,我們不可能人工去找尋符合的程式碼,於是可以用SymbolicateCrash來轉成想要的內容。
操作步驟
- 在桌面建立一個crash資料夾(方便操作)
- Xcode->Window->Organize找到Archives找到App-右擊-Show in Finder
- 尋找產生.crash檔案的源頭.iap檔
- 複製.app和.app.dSYM到crash夾文件-右擊-xcarchive文件->顯示套件內容
指令重點
尋找symbolicatecrash工具存放的地方
$ find /Applications/Xcode.app -name symbolicatecrash -type f
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
將symbolicatecrash拷貝到crash資料夾
$ cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash /Users/Jason/Desktop/crash
將.crash檔案也拷到當前資料夾裡面,自己的或別人(蘋果審查委員)給的。
執行symbolicatecrash
將終端機移至crash資料夾
$ cd
$ cd /Users/Jason/Desktop/crash
查看crash資料夾有哪些檔案(4個:.app、.dSYM、.crash、symbolicatecrash)
$ ls
GarbageGuard.app GarbageGuard.app.dSYM symbolicatecrash test.crash
執行關鍵指令
$ ./symbolicatecrash test.crash GarbageGuard.app.dSYM > GarbageGuard_symbol.crash
可能會發生
Error: “DEVELOPER_DIR" is not defined at ./symbolicatecrash line 60.
執行此行解決它
$ export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer”
再次執行關鍵指令
$ ./symbolicatecrash test.crash GarbageGuard.app.dSYM > GarbageGuard_symbol.crash
成果
原始.crash(節錄)
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 GarbageGuard 0x000000010008adf4 0x100040000 + 306676
1 StoreKit 0x0000000186ce0fac __34-[SKProductsRequest _handleReply:]_block_invoke + 508
2 libdispatch.dylib 0x0000000190d5c010 _dispatch_call_block_and_release + 20
3 libdispatch.dylib 0x0000000190d5bfd0 _dispatch_client_callout + 12
4 libdispatch.dylib 0x0000000190d5f1d8 _dispatch_main_queue_callback_4CF + 332
5 CoreFoundation 0x0000000183d66c28 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
6 CoreFoundation 0x0000000183d64f68 __CFRunLoopRun + 1448
7 CoreFoundation 0x0000000183ca5c1c CFRunLoopRunSpecific + 448
8 GraphicsServices 0x0000000189945c08 GSEventRunModal + 164
9 UIKit 0x0000000186dd6fd8 UIApplicationMain + 1152
10 GarbageGuard 0x0000000100059064 0x100040000 + 102500
11 libdyld.dylib 0x0000000190d77a9c start + 0
生成.crash(節錄)
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 GarbageGuard 0x000000010008adf4 -[IAPHelper productsRequest:didReceiveResponse:] (IAPHelper.m:76)
1 StoreKit 0x0000000186ce0fac __34-[SKProductsRequest _handleReply:]_block_invoke + 508
2 libdispatch.dylib 0x0000000190d5c010 _dispatch_call_block_and_release + 20
3 libdispatch.dylib 0x0000000190d5bfd0 _dispatch_client_callout + 12
4 libdispatch.dylib 0x0000000190d5f1d8 _dispatch_main_queue_callback_4CF + 332
5 CoreFoundation 0x0000000183d66c28 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
6 CoreFoundation 0x0000000183d64f68 __CFRunLoopRun + 1448
7 CoreFoundation 0x0000000183ca5c1c CFRunLoopRunSpecific + 448
8 GraphicsServices 0x0000000189945c08 GSEventRunModal + 164
9 UIKit 0x0000000186dd6fd8 UIApplicationMain + 1152
10 GarbageGuard 0x0000000100059064 main (main.m:16)
11 libdyld.dylib 0x0000000190d77a9c start + 0
記住.app、.dSYM、.crash、symbolicatecrash中的.app和.dSYM要符合對方所產生的.crash,不然是會轉譯失敗的喔!
參考:







Comments on: "[iOS] 使用 SymbolicateCrash 分析崩潰紀錄" (1)
[…] 第一項曾經困擾我許久,因為我自己測試無法重現,稍微修改可能的bug之後,陸續再送了三次,同樣的問題Apple審委就是測得出來⋯⋯好在有方法可以知道crash的原因,也就是使用 SymbolicateCrash 分析崩潰紀錄,馬上知道哪個view controller -> method -> line,終於順利讓垃圾管家上架! […]
讚讚