Just a Computer Graphics Studio & My Life

一直以來我都只看IDE中的crash log,沒想到這次要查看蘋果審查委員給的crash log檔案,這時候麻煩可大了,如果沒有弄清楚crash在哪,審委是不會讓我上架的⋯⋯看了它給的檔案,僅知道是IAP(應用內購買)程序有問題,儘管我怎麼測都沒有發生過!之後我陸續送了兩個版本,審委依然給我同樣的回覆,讓我不得不去找辦法轉譯crash log檔!

crash debug

很幸運地我總算學會SymbolicateCrash來分析崩潰紀錄啦~

使用目的

有天我們想要研究Crash Log,也就是.crash檔,來修正bug,但是內容沒有轉譯完全,所以不知道是哪個view controllermethod發生問題。舉例⋯⋯

原始:

0 GarbageGuard 0x000000010008adf4 0x100040000 + 306676

想要:

0 GarbageGuard 0x000000010008adf4 -[IAPHelper productsRequest:didReceiveResponse:] (IAPHelper.m:76)

原始內容中有沒啥特別意義的位址碼偏移碼,我們不可能人工去找尋符合的程式碼,於是可以用SymbolicateCrash來轉成想要的內容。

操作步驟

  1. 在桌面建立一個crash資料夾(方便操作)
  2. Xcode->Window->Organize找到Archives找到App-右擊-Show in Finder
  3. 尋找產生.crash檔案的源頭.iap檔
  4. 複製.app和.app.dSYM到crash夾文件-右擊-xcarchive文件->顯示套件內容
SymbolicateCrash06

在Xcode中找到該專案的Archive檔

SymbolicateCrash05

按右鍵顯示套件內容

SymbolicateCrash04

就點下去吧~

SymbolicateCrash03

.dSYM複製到crash資料夾中

SymbolicateCrash02

.app複製到crash資料夾中

指令重點

尋找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

成果

SymbolicateCrash01

產生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)

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

    喜歡

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: