2013年8月8日 星期四

Crash Reporting Tools

老樣子 邊看邊寫 有兩部分
http://www.raywenderlich.com/33669/overview-of-ios-crash-reporting-tools-part-1
http://www.raywenderlich.com/34050/overview-of-ios-crash-reporting-tools-part-2

我玩過了TestFlight才發現這篇~
不過其實這不太需要看上面兩篇的教學, 因為真的很簡單...
那兩篇我只當作是工具介紹讓我認識, "噢~ 原來還有其他工具可以用啊"

先解釋 Symbolication 是啥, 這是我的認知, 可能不一定對
簡單說就是把一些記憶體位置的內容轉換為人看得懂的東西
比如一個Method, 它自己有個記憶體位置, 然後透過Symbolication之後會把位置轉為人看得懂的東西
而轉換必須透過一個翻譯工具, 也就是 .dSYM 檔案來翻譯它

這是一個我用TestFlight做的測試例子, 我一開始沒上傳 .dSYM檔
然後讓App Crash, Crash Report會自動上傳到TestFlight上

可以看到它有指出推測有錯誤的地方
3 TestFilght 0x000bd63b _mh_execute_header + 5691
嗯 誰看得懂這啥鬼~

接著就是要把 .dYSM檔案上傳, 至於這檔案在哪
在要生成 .ipa的時候都會經過個Archives, 然後在Archives完成之後
對著產出的 Archives右鍵 -> show in finder
會出現 TestFilght 13-8-7 下午4.01.xcarchive (檔名隨環境改變)
然後對著這檔案右鍵 -> 顯示套件內容
裡面有資料夾dSYMs -> TestFilght.app.dSYM (檔名隨環境改變)
然後把這檔案複製出來, 上傳到TestFlight網站
注意 dYSM要壓縮成zip, 右鍵按壓縮變為TestFilght.app.dSYM.zip就好了

上傳好之後會顯示
接著重整網頁, 就完成了
3 TestFilght 0x000bd63b -[ViewController crash:] (ViewController.m:32)
哪個Class, 第幾行, 都指出來了

基本上Xcode上不會出現看不懂的東西, 預設都已經處理得妥妥的





進入工具吧, 其實工具沒啥好介紹的, 官網介紹很詳細, 我挑了兩個來試用
  • Crashlytics
被推特收購, 根據這篇文章, 很多人推薦使用
它的安裝方式很特殊
首先要去官網申請註冊填寫名字跟Email, 注意是申請, 也就是不會馬上完成
然後大概隔天就會收到官方的Invitation to Join Crashlytics信件
照著操作完成之後會下載個Mac App, 之後同樣照著App內的說明
大概是要選擇欲安裝SDK的Project, 然後設定個script, 拖曳Library到專案裡面
然後在 application:didFinishLaunchingWithOptions: 設定APIKey, 就完成了
[Crashlytics startWithAPIKey:@"xxx"];

它有一些方法可供使用

Force Crash, 按下之後Crash, 然後重啓程式, 才看得到Crash Report
[[Crashlytics sharedInstance] crash];

Custom Log
CLS_LOG(@"CLS_LOG, Currrent Time: %@", [NSDate date]);

Custom Keys
[Crashlytics setObjectValue:@"ObjectValue" forKey:@"ObjectValue"];
[Crashlytics setIntValue:10 forKey:@"IntValue"];
[Crashlytics setBoolValue:YES forKey:@"BoolValue"];
[Crashlytics setFloatValue:3.14f forKey:@"FloatValue"];

User Information
[Crashlytics setUserIdentifier:[NSString stringWithFormat:@"%@", [[UIDevice currentDevice] identifierForVendor]]];
[Crashlytics setUserName:@"xxx"];
[Crashlytics setUserEmail:@"xxx"];

以下是一些有興趣官網FAQ:
Do you catch out of memory crashes?
官網說一堆, 結論就是現在還不行

How long does it take for a crash to be processed and show up on my dashboard?
We process in real-time.
可能是我有誤解, 或是網路延遲
不是Crash當下立即發送, 而是要等Crash之後下次啓動App才會送出

Why can't I have Xcode connected?
Xcode's debugger prevents us from processing crash reports.
App在Build&Run裝進實機或是模擬器之後, 請Stop退出然後點Icon啟動

  • TestFlight
TestFlight跟其它測試工具有幾個很大的不同點

一者是測試人員可以不用把機器拿過來開發者這邊裝, 不過前提是~ 需要先把測試人員的機器加入到Provisioning Profile中
再者是TestFlight主要用於內測用的, 不過要用於發佈版應該也是沒問題
Crashlytics則主要用於發佈後搜集一般User的Crash Report

TestFlight is a free platform used to distribute beta and internal iOS/Android applications to team members over-the-air

一開始當然先註冊, 然後Create Team, 接著~
Upload Build(到這邊就可以先打住, 不用上傳)
這也是跟其他Crash回報工具最大的不同, 需要上傳Build, 也就是 .ipa

接著來設定SDK與寫一點程式, 這裡有SDK下載以及文件說明, SDK安裝不介紹, Pod可以無腦安裝進去

程式部份基本上跟Crashlytics差不多

Token設定, 官方說法是在測試的時候提供UDID會有比較好的測試結果, 但在發佈版記得拿掉, 不然蘋果不會審核過
[TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];
[TestFlight takeOff:@"xxx"];

Options, 引用官方介紹
extern NSString *const TFOptionAttachBacktraceToFeedback; // Defaults to @NO. Setting to @YES attaches the current backtrace, with symbols, to the feedback.
extern NSString *const TFOptionDisableInAppUpdates; // Defaults to @NO. Setting to @YES, disables the in app update screen shown in BETA apps when there is a new version available on TestFlight.
extern NSString *const TFOptionLogToConsole; // Defaults to @YES. Prints remote logs to Apple System Log.
extern NSString *const TFOptionLogToSTDERR; // Defaults to @YES. Sends remote logs to STDERR when debugger is attached.
extern NSString *const TFOptionReinstallCrashHandlers; // If set to @YES: Reinstalls crash handlers, to be used if a third party library installs crash handlers overtop of the TestFlight Crash Handlers.
extern NSString *const TFOptionSendLogOnlyOnCrash; // Defaults to @NO. Setting to @YES stops remote logs from being sent when sessions end. They would only be sent in the event of a crash.
用法~
[TestFlight setOptions:@{TFOptionLogToConsole: @YES}]

Check Poing
[TestFlight passCheckpoint:NSStringFromSelector(_cmd)];

Feedback
[TestFlight openFeedbackView];

Custom Log
#define NSLog(__FORMAT__, ...) TFLog((@"%s [Line %d] " __FORMAT__), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
NSLog(@"Current Time:%@", [NSDate date]);

Custom Information
[TestFlight addCustomEnvironmentInformation:@"Object" forKey:@"Key"];

還可以自定錯誤處理, 不過超出我能力範圍了~ = =
基本上就這幾個方法

剩下的我講重點就好, 打太多我累了
Server也就是開發者這邊, 上傳.ipa, 然後進入Permission選擇測試人員, 如果選單中沒有就用下面的Mail發送連結, 不過前提是要邀請的人要包含在Provisioning Profile中
而Crash Report如果看不懂則要上傳dSYM
Client也就是測試人員這邊, 收到Mail點開之後會安裝TestFlight的描述檔, 然後會有個TestFlight的Icon, 進入可以看到目前可以參與測試的App

1 則留言:

  1. 赞!最近遇到Crashlytics无法上传crash report的问题,正好找到您的文章,虽然没有得到什么线索,但也收获一些技巧。谢谢!

    回覆刪除