最開始想iOS和Android都做了,後面嘗試了下android上面的崩潰收集,困難程度超出我的想象,也可以說幾乎不可能實現像iOS下面一樣實用且方便的崩潰收集系統(1.有堆棧等資訊,不會產生卡死等副作用。 2.專指jni崩潰,java的崩潰很容易處理)。 這個有一點要反思一下,在困難的地方浪費時間不如把簡單的東西做好,那麼多賺大錢的遊戲也是各種不完美,但是玩家不會在意程式是否牛x,技術是否高明,只要玩家想玩的核心點做到極致就可以了。
1、在崩潰的時候使用 (這裡)提到的方式來擷取堆棧直接上傳到伺服器。 這個可以進行粗略定位,並且是明文的,不需要額外工具轉換格式。 缺點是,不能定位到具體行。但是很多情況下這個也是足夠使用的。
2、使用plcrashreporter 擷取到崩潰記錄檔。 在遊戲下一次開始啟動並執行時候上傳這個崩潰檔案到伺服器。 我們擷取到這個檔案後具體分析過程:
a、將發布版本時備份的dSYM符號檔案和崩潰資訊檔(xx.plcrash) 放到一個檔案夾
b、需要用到的工具 plcrashutil (這個在plcrashreporter發布包的Tools檔案夾下) symbolicatecrash(這個在xcode程式檔案夾下 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/)
c、運行命令
[plain] view plaincopyprint?
- ./plcrashutil convert --format=iphone live_report.plcrash > test.crash
- export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
- ./symbolicatecrash test.crash DemoCrash-iOS-Device.app.dSYM > crash_readable.log
./plcrashutil convert --format=iphone live_report.plcrash > test.crashexport DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer./symbolicatecrash test.crash DemoCrash-iOS-Device.app.dSYM > crash_readable.log
第一個命令將plcrash轉換為蘋果標準崩潰格式,第二個命令可以根據dSYM符號檔案解析出崩潰資訊,可以定位到具體行,例如:
[plain] view plaincopyprint?
- Thread 0 Crashed:
- 0 DemoCrash-iOS-Device 0x00002780 stackFrame (main.m:41)
-
- Thread 1:
- 0 libsystem_kernel.dylib 0x368ad3a8 kevent + 24
- 1 libdispatch.dylib 0x376dabc9 _dispatch_mgr_wakeup + 1