KSCrash的基本使用
KSCrash是 iOS 平臺最強(qiáng)大的崩潰收集開源庫之一寒砖。支持多設(shè)備的崩潰收集(Mac\iPhone\Apple Watch\TV)自沧,最新的好像在支持Android。
KSCrash 能夠收集以下類型的異常:
- Mach kernel exceptions
- Fatal signals
- C++ exceptions
- Objective-C exceptions
- Main thread deadlock (experimental)
- Custom crashes (e.g. from scripting languages)
基本使用
支持Hockey廊酣、QuincyKit锉罐、Victory帆竹、Email四種日志發(fā)送方式,也可以增加自己的發(fā)送接口脓规。Hockey/QuincyKit/Victory幾乎用不到栽连,郵件方式或者發(fā)送到自己后臺才是大多數(shù)的選擇
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let installation = makeEmailInstallation()
installation.install()
/* Crash移除策略 KSCDeleteBehavior
* KSCDeleteNever 從不移除
* KSCDeleteOnSucess 發(fā)送成功之后移除
* KSCDeleteAlways 總是移除
*/
KSCrash.sharedInstance().deleteBehaviorAfterSendAll = KSCDeleteOnSucess
// 發(fā)送成功后的處理
installation.sendAllReports { (reports, completed, error) -> Void in
if(completed) {
print("Sent \(String(describing: reports?.count)) reports")
} else {
print("Failed to send reports: \(String(describing: error))")
}
}
return true
}
- 郵件形式
// 發(fā)送郵件
func makeEmailInstallation() -> KSCrashInstallation {
let installation = KSCrashInstallationEmail.sharedInstance()!
installation.recipients = ["YOUR EMAIL"]
installation.subject = "Crash Report"
installation.message = "This is a crash report"
//.gz格式---會對report.crash文件進(jìn)行壓縮,如果不以.gz的格式導(dǎo)出,那么導(dǎo)出的會是亂碼
// report.crash可以隨便命名
installation.filenameFmt = "report.crash.gz"
/* crash上報類型
* KSCrashEmailReportStyleJSON json類型
* KSCrashEmailReportStyleApple apple類型(Xcode上看到的類型)
*/
installation.reportStyle = KSCrashEmailReportStyleApple
// 彈框提示
installation.addConditionalAlert(withTitle: "Crash Detected",
message: "The app crashed last time it was launched. Send a crash report?",
yesAnswer: "Sure!",
noAnswer: "No thanks")
return installation
}
郵件的發(fā)送秒紧,是第二次啟動的時候發(fā)送绢陌,無法在crash之后就發(fā)送,會存在問題熔恢。
- 上傳到自己的服務(wù)器
// 上傳到自己的服務(wù)器
func makeStandardInstallation() -> KSCrashInstallation{
let url = URL(string: "http://put.your.url.here")
let standard = KSCrashInstallationStandard.sharedInstance()!
standard.url = url
return standard;
}
3.其他的不常用的形式脐湾,可以去Github上查看
4.源碼的分析可參考:KSCrash源碼分析
雖然KSCrash支持堆棧符號化,但是比較受限绩聘。
Symbolicatecrash
symbolicatecrash是Xcode自帶的一個分析工具沥割,可以通過崩潰日志和應(yīng)用的.dSYM文件定位發(fā)生崩潰的位置,把crash日志中的一堆地址替換成代碼相應(yīng)位置凿菩。
Xcode->Window->Devices and Simulators->真機(jī)->View Device Logs看到的crash日志机杜,就是通過symbolicatecrash分析出來的
使用過程:
新建日志文件夾 eg: Crash
終端輸入命令
find /Applications/Xcode.app -name symbolicatecrash -type f
獲取symbolicatecrash的文件路徑,然后通過路徑找到symbolicatecrash工具衅谷,copy到Crash文件夾-
獲取.dSYM文件
2.
1.Xcode->Archive 會將工程打包
3.
4.
5.將.dSYM文件copy到Crash文件夾 將KSCrash獲取到的崩潰文件(eg: 郵件形式KSCrashEmailReportStyleApple類型獲取的report.crash椒拗,我調(diào)試時是用這種形式)copy到Crash文件夾
- 終端執(zhí)行:
cd到Crash文件夾
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
-
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
解釋:-
./*.crash
是當(dāng)前目錄下的.crash
文件,這里指report.crash
获黔,這個不是固定的蚀苛,可以根據(jù)你的崩潰文件來修改(eg: 如果你導(dǎo)出崩潰文件命名為xxx.log
,那這里就應(yīng)該是./*.log
) -
symbol.crash
是解析后的日志文件,也可以自定義命名
3.
*
是泛指玷氏,上面這種一種通用的形式堵未,不用特定指定具體的名字 -
符號化前后對比:
注意:我個人在調(diào)試中發(fā)現(xiàn): KSCrash只收集真機(jī)下的crash,并且用這種方式符號化崩潰日志盏触,如果是Debug環(huán)境下的日志渗蟹,是解析不了的,所以在Run真機(jī)的時候赞辩,我改成了Relese環(huán)境