First
相信有很多開發(fā)者在項目中加入了友盟統(tǒng)計,其中一個最主要的功能就是查看線上版本統(tǒng)計到的錯誤淘这。但是當(dāng)你看到這樣的信息時:
會不會有這樣的想法:
這尼瑪?shù)降资鞘裁垂戆郏浚。?/p>
此時你可能會百度(干得漂亮B燎睢)朦乏,我相信你“閃閃”的雙眼肯定會看到這篇文章的:dSYM文件分析工具。具體用法我就不重復(fù)了氧骤,博主寫的很詳細呻疹,而且這個工具真的真的很好用!
Second
但是,友盟還統(tǒng)計到了這么一堆錯誤:
這尼瑪又是什么鬼刽锤?D鞒摺!怎么會這么多并思!
點進去看到是這樣的:
用咱們上面說的工具:
這庐氮、這、這讓我怎么玩宋彼,還能不能愉快的玩耍了…T_T
當(dāng)然弄砍,這并不只在“Application received signal SIGSEGV (null)”這種情況下才發(fā)生,這時怎么辦呢?不要捉急输涕,少年請看這里:解析iOS崩潰日志(crash Log)音婶。
Third
上面這兩種方法應(yīng)該就可以解決大部分友盟統(tǒng)計到的錯誤了,這時你要說了莱坎,這兩種方法都解決不了的怎么辦衣式?少年,此次此刻我要傳授你一招江湖失傳很久的絕學(xué)秘笈:把那些無法解決的錯誤全部勾選上檐什,然后選擇把狀態(tài)標記為“處理中”碴卧,然后再標記為“已修復(fù)”,怎么樣乃正,騷年住册,是不是解決了!2333瓮具,但是少用為好荧飞,原因你懂的。
At last
最后感謝answer-huang和裂云野的博文分享搭综。
【友盟統(tǒng)計報表解讀】之錯誤分析iOS版
錯誤分析功能說明
1.概述
錯誤分析是友盟為移動開發(fā)者提供的Crash收集和分析工具,幫助開發(fā)者監(jiān)測App在移動設(shè)備上的運行狀況划栓,及時發(fā)現(xiàn)并解決錯誤兑巾,提升App的穩(wěn)定性。
新版錯誤分析的主要功能點如下:
(1) 通過友盟后臺網(wǎng)站管理錯誤內(nèi)容忠荞。
您可以按照版本蒋歌、UUID、操作系統(tǒng)委煤、機型篩選錯誤; 還可以根據(jù)不同的條件為錯誤添加標簽堂油,便于快速分類及查找錯誤。
(2) 通過友盟錯誤分析工具定位錯誤碧绞。
您可以在友盟后臺網(wǎng)站批量導(dǎo)出錯誤府框,并借助命令行工具將錯誤快速定位到具體的代碼行數(shù)。
2.詳細說明2.1 錯誤列表頁
錯誤列表中展示的錯誤摘要的生成規(guī)則是讥邻,將收集Crash日志通過一定算法聚合后按照UUID拆分的錯誤的堆棧信息的第一行迫靖。
每天展示當(dāng)日發(fā)生的錯誤院峡,且每天至多展示1000條錯誤類型。當(dāng)錯誤類型超過1000條時系宜,當(dāng)日錯誤列表中的數(shù)據(jù)不再更新照激。次日恢復(fù)。
當(dāng)錯誤列表中超過1000條時盹牧,請在版本管理中取消不關(guān)注的版本俩垃;版本取消后,當(dāng)日不再接收該版本的錯誤汰寓,但不會減少當(dāng)日已接收的錯誤數(shù)口柳。
2.1.1 篩選
按照您為錯誤標記的狀態(tài)來篩選錯誤
選擇至多3個版本,只展示選中版本的數(shù)據(jù)
通過UUID來搜索錯誤
通過操作系統(tǒng)或機型來篩選錯誤
通過自定義標簽來篩選錯誤踩寇,同時可添加新標簽或刪除標簽
2.1.2 標記
(1) 添加標記
選中相應(yīng)的錯誤 啄清,可以為其添加多個標簽或標記為已修復(fù)/未修復(fù)。
為選中的錯誤添加標簽
為選中的錯誤標記修復(fù)狀態(tài)俺孙,便于跟蹤錯誤
(2) 修改或刪除標記
如果想修改標簽辣卒,需進入錯誤詳情頁進行修改
2.1.3 導(dǎo)出
導(dǎo)出當(dāng)前頁面內(nèi)的全部錯誤,或?qū)С鲈擁撁鎯?nèi)勾選的錯誤
2.1.4 管理版本(1)查看今日接收的錯誤數(shù)并進行版本管理
今日錯誤數(shù)展示的是今日收到的全部錯誤數(shù)(聚合后的錯誤類型數(shù))睛榄;當(dāng)今日錯誤類型超過1000個的限制時荣茫,此處的數(shù)據(jù)不再更新。
選擇接收錯誤信息的版本场靴,當(dāng)某版本取消選中時啡莉,該版本的錯誤信息將不再繼續(xù)接收。
(2)選擇接收錯誤的版本
該版本今日收到的總錯誤數(shù)
展開/收起UUID列表
2.2 錯誤詳情
錯誤詳情頁面展示的是錯誤詳細的stacktrace以及其他相關(guān)信息旨剥。
2.2.1 基本信息
包括錯誤的首次發(fā)生時間咧欣、最近一次發(fā)生時間、今天發(fā)生的次數(shù)以及出現(xiàn)的應(yīng)用版本轨帜。
該錯誤首次發(fā)生的時間
該錯誤最近一次的發(fā)生時間
該錯誤出現(xiàn)的總次數(shù)
發(fā)生該錯誤的應(yīng)用版本
2.2.2 終端概況
終端概況提供了設(shè)備魄咕,機型和操作系統(tǒng)的聯(lián)合分布信息,可以點擊查看分布詳情蚌父。
2.2.3 錯誤詳情
可以修改錯誤標簽哮兰,修改錯誤狀態(tài)。
修改錯誤的標簽
修改錯誤的已修復(fù)/未修復(fù)狀態(tài)
2.3 錯誤分析工具的使用
第一步下載錯誤分析工具并解壓zip得到umcrashtool文件苟弛,可將umcrashtool與已下載的xxx.csv文件放入同一目錄下喝滞。
第二步 在terminal中運行umcrashtool命令,參數(shù)為錯誤分析的.csv文件絕對路徑膏秫,如下:
sanzhang$ ./umcrashtool [absolutely_path_of_csv_file]
將umcrashtool與錯誤分析.csv文件放入同一目錄下
第三步 在terminal中運行umcrashtool右遭,提示如下: Usage: umcrashtool [export-file-path],定位后的代碼及行數(shù)會寫入錯誤分析-symbol.csv文件,與原文件在同一目錄下狸演。用工具打開新生成的xxx-symbol.csv文件言蛇,便可查看錯誤發(fā)生的源碼文件及行數(shù)。
注:如果錯誤分析沒有成功宵距,請先確保對應(yīng)的 xxx.dSYM 文件在 ~/Library/Developer/Xcode/ 或該路徑的子目錄下腊尚。(對于每一個產(chǎn)品發(fā)布時archive操作會將dsym文件存放到~/Library/Developer/Xcode/Archives路徑下,因此建議保留該路徑下的文件满哪,以便后續(xù)用工具分析錯誤婿斥。)
更詳細的使用教程見這里。
3. FAQ
Q:錯誤類型超過1000個的限制該如何處理哨鸭?
A:每天至多展示1000個錯誤民宿,當(dāng)超過1000個的限制后,該日的數(shù)據(jù)不再更新像鸡。次日恢復(fù)活鹰。
當(dāng)超過限制后,您可以在版本管理中選擇接收錯誤的版本/UUID只估,對不關(guān)注的版本/UUID取消選中志群。取消選中的版本/UUID不再接收錯誤。
選擇您關(guān)注的版本/UUID接收錯誤蛔钙,關(guān)閉不關(guān)注的版本锌云,會降低次日錯誤超過1000的情況。
Q:為什么有些錯誤無法通過友盟提供的工具定位 吁脱?
A:因為您使用的SDK版本過低桑涎。 必須使用v2.1.3以后的SDK才能正確的定位Crash log。
Q:使用umcrashtool為什么沒有正確的翻譯出錯誤 兼贡?
A:您需要確保dSYM文件存放在/Users/xx/Library/Developer/Xcode/或者它的子目錄下攻冷,路徑中不要出現(xiàn)空字符。
Q:為什么生成的csv文件打開有亂碼遍希?
A:csv文件我們使用的UTF8編碼格式等曼,需要選用相應(yīng)的格式打開,在Mac平臺可以用系統(tǒng)自帶的Numbers或免費軟件LibreOffice打開孵班。目前的Microsoft Office for Mac 打開會有亂碼的問題涉兽。
Q:使用umcrashtool為什么沒有正確的翻譯出錯誤招驴?
A:首先請確保dSYM文件存放在 ~/Library/Developer/Xcode/或者它的子目錄下篙程。另外, 目前的錯誤捕捉工具針對一些系統(tǒng)信號導(dǎo)致的崩潰信息,存在無法解析的情況别厘,最后可能是dsym文件提供的信息量不夠虱饿,導(dǎo)致部分解析失敗。我們的技術(shù)人員一直在努力提高能夠捕獲和分析的崩潰的類型,如果您在這方面有建議氮发,也可以通過郵件support@umeng.com或友盟開發(fā)者社區(qū)反饋給我們渴肉。
!K帷3鸺馈!颈畸!命令行工具解析Crash文件,dSYM文件進行符號化序
在日常開發(fā)中乌奇,app難免會發(fā)生崩潰。簡單的崩潰還好說眯娱,復(fù)雜的崩潰就需要我們通過解析Crash文件來分析了礁苗,解析Crash文件在iOS開發(fā)中是比較常見的。
獲取崩潰信息方式
在iOS中獲取崩潰信息的方式有很多徙缴,比較常見的是使用友盟试伙、云測、百度等第三方分析工具于样,或者自己收集崩潰信息并上傳公司服務(wù)器疏叨。
下面列舉一些我們常用的崩潰分析方式:
使用友盟、云測百宇、百度等第三方崩潰統(tǒng)計工具考廉。
自己實現(xiàn)應(yīng)用內(nèi)崩潰收集,并上傳服務(wù)器携御。
Xcode-Devices中直接查看某個設(shè)備的崩潰信息昌粤。
使用蘋果提供的Crash崩潰收集服務(wù)。(少用)
收集崩潰信息
蘋果給我們提供了異常處理的類啄刹,NSException類涮坐。這個類可以創(chuàng)建一個異常對象,也可以通過這個類獲取一個異常對象誓军。
這個類中我們最常用的還是一個獲取崩潰信息的C函數(shù)袱讹,我們可以通過這個函數(shù)在程序發(fā)生異常的時候收集這個異常。
// 將系統(tǒng)提供的獲取崩潰信息函數(shù)寫在這個方法中昵时,以保證在程序開始運行就具有獲取崩潰信息的功能- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {// 將下面C函數(shù)的函數(shù)地址當(dāng)做參數(shù)NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);returnYES;? }// 設(shè)置一個C函數(shù)捷雕,用來接收崩潰信息voidUncaughtExceptionHandler(NSException*exception){// 可以通過exception對象獲取一些崩潰信息,我們就是通過這些崩潰信息來進行解析的壹甥,例如下面的symbols數(shù)組就是我們的崩潰堆棧救巷。NSArray*symbols = [exception callStackSymbols];NSString*reason = [exception reason];NSString*name = [exception name];? }
我們也可以通過下面方法獲取崩潰統(tǒng)計的函數(shù)指針:
NSUncaughtExceptionHandler*handler =NSGetUncaughtExceptionHandler();
dSYM 符號集
符號集是我們對ipa文件進行打包之后,和.app文件同級的后綴名為.dSYM的文件句柠,這個文件必須使用Xcode進行打包才有浦译。
每一個.dSYM文件都有一個UUID棒假,和.app文件中的UUID對應(yīng),代表著是一個應(yīng)用精盅。而.dSYM文件中每一條崩潰信息也有一個單獨的UUID帽哑,用來和程序的UUID進行校對。
我們?nèi)绻皇褂?dSYM文件獲取到的崩潰信息都是不準確的叹俏。
符號集中存儲著文件名妻枕、方法名、行號的信息粘驰,是和可執(zhí)行文件的16進制函數(shù)地址對應(yīng)的佳头,通過分析崩潰的.Crash文件可以準確知道具體的崩潰信息。
我們每次Archive一個包之后晴氨,都會隨之生成一個dSYM文件康嘉。每次發(fā)布一個版本,我們都需要備份這個文件籽前,以方便以后的調(diào)試亭珍。進行崩潰信息符號化的時候,必須使用當(dāng)前應(yīng)用打包的電腦所生成的dSYM文件枝哄,其他電腦生成的文件可能會導(dǎo)致分析不準確的問題肄梨。
Archive.png
當(dāng)程序崩潰的時候,我們可以獲得到崩潰的錯誤堆棧挠锥,但是這個錯誤堆棧都是0x開頭的16進制地址江滨,需要我們使用Xcode自帶的symbolicatecrash工具來將.Crash和.dSYM文件進行符號化窖剑,就可以得到詳細崩潰的信息。
崩潰分析
命令行解析Crash文件
通過Mac自帶的命令行工具解析Crash文件需要具備三個文件
symbolicatecrash,Xcode自帶的崩潰分析工具懂牧,使用這個工具可以更精確的定位崩潰所在的位置蝙茶,將0x開頭的地址替換為響應(yīng)的代碼和具體行數(shù)宵呛。
我們打包時產(chǎn)生的dSYM文件茄厘。
崩潰時產(chǎn)生的Crash文件,例如:*.crash。
我在解析崩潰信息的時候稠茂,首先在桌面上建立一個Crash文件夾柠偶,然后將.Crash、.dSYM睬关、symbolicatecrash放在這個文件夾中诱担,這樣進入這個文件夾下,直接一行命令就解決了电爹。
symbolicatecrash我們可以在下面路徑下可以找到蔫仙,我用的是Xcode7,其他版本Xcode路徑不一樣藐不,請自行Google匀哄。
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash
選中archive的版本右擊,選擇Show in Finder就可以選中archived 文件然后顯示包內(nèi)容雏蛮,就可以找到dSYM文件了涎嚼。
dsym文件位置.png
將.Crash、.dSYM挑秉、symbolicatecrash三個文件都放在我們在桌面建立的Crash文件夾中法梯。
crash.png
進行解析的工作
開啟命令行工具,進入崩潰文件夾crash中
cd/Users/自己MacPro上的名字/Desktop/崩潰文件夾crash
使用命令解析Crash文件犀概,*號指的是具體的文件名
./symbolicatecrash ./*.crash ./*.app.dSYM > symbol.crash
如果上面命令不成功立哑,使用命令檢查一下環(huán)境變量
xcode-select -print-path
返回結(jié)果:
/Applications/Xcode.app/Contents/Developer/
如果不是上面的結(jié)果,需要使用下面命令設(shè)置一下導(dǎo)出的環(huán)境變量姻灶,然后重復(fù)上面解析的操作铛绰。(這一步很重要)
export DEVELOPER_DIR=/Applications/XCode.app/Contents/Developer
解析完成后會生成一個新的.Crash文件,這個文件中就是崩潰詳細信息产喉。圖中紅色標注的部分就是我們代碼崩潰的部分捂掰。
result.png
注意,以下情況不會有崩潰信息產(chǎn)生:
內(nèi)存訪問錯誤(不是野指針錯誤)
低內(nèi)存曾沈,當(dāng)程序內(nèi)存使用過多會造成系統(tǒng)低內(nèi)存的問題这嚣,系統(tǒng)會將程序內(nèi)存回收
因為某種原因觸發(fā)看門狗機制
通過Xcode查看設(shè)備崩潰信息
除了上面的系統(tǒng)分析工具來進行分析,如果是我們自己直接使用手機連接崩潰或者崩潰之后連接手機塞俱,選擇window-> devices -> 選擇自己的手機 -> view device logs 就可以查看我們的崩潰信息了姐帚。
deviceLog.png
只要手機上的應(yīng)用是這臺電腦安裝打包的,這樣的崩潰信息系統(tǒng)已經(jīng)為我們符號化好了障涯,我們只需要進去之后等一會就行(不要相信這里面的進度刷新罐旗,并不準確),如果還是沒有符號化完畢 唯蝶,我們選擇文件尤莺,然后右擊選擇Re-Sysbomlicate就可以。
如果是使用其他電腦進行的打包生棍,我們可以在這里面將Crash文件導(dǎo)出颤霎,自己通過命令行的方式進行解析。
? 著作權(quán)歸作者所有
如果覺得我的文章對您有用涂滴,請隨意打賞友酱。您的支持將鼓勵我繼續(xù)創(chuàng)作!
打賞支持
2樓 · 2016.05.18 08:43
請問博主柔纵,你的crash文件指的是什么文件缔杉,對于友盟統(tǒng)計的錯誤來說,我要怎么獲取crash文件呢搁料?謝謝
天清水藍:@EmptyWalker同問或详,我用的云測統(tǒng)計系羞,云測里面連內(nèi)存地址都沒有。霸琴。椒振。更坑!想知道上線的應(yīng)用.crash文件怎么獲取
2016.08.02 20:10回復(fù)
Somerr態(tài):同問澎迎,從友盟怎么獲取crash文件?
2016.09.10 17:01回復(fù)
3樓 · 2016.09.08 17:46
Mark 大神 膜拜啊
4樓 · 2016.11.18 14:26
現(xiàn)在xcode獲取的crash文件好像是自動符號化了的吧?
5樓 · 2016.12.06 17:07
symbolicatecrash我們可以在下面路徑下可以找到夹供,我用的是Xcode7仁堪,其他版本Xcode路徑不一樣哮洽,請自行Google。
find /Applications/Xcode.app -name symbolicatecrash -type f