最開始想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、運行命令
- ./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.crash export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer ./symbolicatecrash test.crash DemoCrash-iOS-Device.app.dSYM > crash_readable.log
第一個命令將plcrash轉換為蘋果標准崩潰格式,第二個命令可以根據dSYM符號文件解析出崩潰信息,可以定位到具體行,例如:
- 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