以前對(duì)于這方面了解的很少,在工作中需要用到這方面的東西,所以,把自己學(xué)習(xí)的東西寫出來分享一下。
對(duì)于carsh日志來說,我們有這么幾種的獲取方式:
1,直接從真機(jī)獲取,連接手機(jī),然后在Xcode->Device->View Device Log 然后找對(duì)對(duì)應(yīng)的app日志。結(jié)果如下圖所示:
像這樣的其實(shí)是已經(jīng)符號(hào)化完成的日志,我們可以看出是在什么方法中哪一個(gè)類中產(chǎn)生的崩潰。
2.就是使用類似bugly的第三方。這樣的第三方會(huì)收集崩潰信息,雖然這樣的第三方已經(jīng)對(duì)崩潰信息進(jìn)行了符號(hào)化。但是有時(shí)候并不能準(zhǔn)確的定位到是哪一個(gè)類哪一個(gè)方法產(chǎn)生的崩潰。那就需要我們對(duì)收集到的crash日志進(jìn)行符號(hào)化。
Crash日志包含了進(jìn)程信息、基本信息、異常信息、線程回溯、Crash的調(diào)用棧、動(dòng)態(tài)庫的信息。對(duì)于這樣的日志,如果沒有符號(hào)化是基本不可能出崩潰出現(xiàn)的地方的,所以需要對(duì)Crash日志進(jìn)行符號(hào)化處理。符號(hào)化處理的方式有一下兩種:
1.Xcode符號(hào)化
2.symbolicatecrash腳本符號(hào)化
但是這兩種符號(hào)化的方式都是基于atos(mac自帶)。這里就講一下如何利用atos對(duì)Crash日志進(jìn)行符號(hào)化處理。使用atos符號(hào)化,首先要找到dSYM文件。dSYM文件是在編譯時(shí)生成的,可以在Xcode-Window-Organizer-Archives中找到打包后的文件顯示包內(nèi)容,即可找到dSYM文件。
使用如下的atos命令就可以符號(hào)化的處理:
atos -arch 內(nèi)核類型 -o dSYM 路徑 -l base address load address
在實(shí)際中,由于Crash日記的搜集是我們自己弄得,在計(jì)算load address的時(shí)候遇到了一些問題,這里把如何計(jì)算load address的方法也寫一下
NSString *slide = @"";
for (uint32_t i = 0; i < _dyld_image_count(); i++) {
if (_dyld_get_image_header(i)->filetype == MH_EXECUTE) {
slide = [NSString stringWithFormat:@"%lx", _dyld_get_image_vmaddr_slide(i)];
break;
}
}
后來找到了個(gè)大神寫的符號(hào)化的工具很方便我把它分享出來地址如下:https://pan.baidu.com/s/1c2oo3vE
如果有不對(duì)的地方或不明白的地方請(qǐng)給我留言!