本文把重點自己介紹的放在了前面祭陷,后面兩部分是擴充,大牛寫的比我的好,后面兩部分大家可以參考他們完整的文章盐欺。
3. 代碼bug 重點解析
1.首先必須有,crash日志和.DSYM文件:步驟
1.找到之前上傳到AppStore的.xcarchive文件仅醇,XCode->Window->Orgainize冗美,右鍵在Finder中顯示
2.右鍵顯示包內(nèi)容進入dSYMs文件夾,找到.dSYM文件
3.然后通過Terminal工具跳轉(zhuǎn)到.dSYM文件
$ cd ~/Library/Developer/Xcode/Archives/yyyy-mm-dd/appname.xcarchive/dSYMs/appname.app.dSYM
4.通過ls與cd指令進入DWARF路徑
kermitdeMacBook-Air:appname.app.dSYM kermit$ ls
Contents
kermitdeMacBook-Air:appname.app.dSYM kermit$ cd contents
kermitdeMacBook-Air:contents kermit$ ls
Info.plist Resources
kermitdeMacBook-Air:contents kermit$ cd resources
kermitdeMacBook-Air:resources kermit$ ls
DWARF
kermitdeMacBook-Air:resources kermit$ cd dwarf
kermitdeMacBook-Air:dwarf kermit$ ls
appname
5.根據(jù)處內(nèi)存地址反編譯找到源碼行
$ atos -arch arm64 -o appname 0x********
如果以上沒有找到具體的行的話:那么如圖:轉(zhuǎn)成16進制【偏移地址】
接著如圖輸入析二,即可找到對應(yīng)的行了粉洼。
也可以轉(zhuǎn)成16進制后進入crash文件中找到對應(yīng)的基地址,按第五步執(zhí)行也能找到叶摄。
1.獲取崩潰日志的幾種方法:
-
1属韧、當用戶抱怨閃退時,你可以要求他讓設(shè)備與iTunes同步蛤吓,設(shè)備與電腦上的iTunes Store同步后宵喂,會將崩潰日志保存在電腦上(路徑:Mac OS X:~/Library/Logs/CrashReporter/MobileDevice/)到上述位置把崩潰日志下載下來,然后通過電子郵件發(fā)送給你会傲;
用這個方法獲取崩潰日志時锅棕,你必需盡量獲取用戶設(shè)備生成的所有崩潰日志。因為崩潰日志越多淌山,就越容易診斷問題所在裸燎。
-
2、如果你裝了Xcode泼疑,也能很容易通過Xcode從你的設(shè)備上獲得崩潰日志德绿;將iOS設(shè)備連接到電腦上,然后打開Xcode王浴;
xcode7.3中從菜單欄上選擇 Window菜單, 然后選擇 Devices (快捷方式是 Shift-CMD-2)在窗口上, 選中 Devices 標簽欄脆炎,在左側(cè)的導航面板上,選中設(shè)備名稱氓辣;Devices information下面的Device Logs是你所有設(shè)備(曾經(jīng)連接到Xcode的)的日志秒裕;每個設(shè)備下面的Device Logs是對應(yīng)設(shè)備的日志。
3钞啸、應(yīng)用提交到App Store后几蜻,你也能從iTunes Connect 獲取到用戶的崩潰日志喇潘,登錄到iTunes Connect 上,選擇 Manage Your Applications梭稚, 點擊相應(yīng)的應(yīng)用颖低,點擊應(yīng)用圖標下面的View Details按鈕, 然后點擊右欄Links部分的 Crash Reports弧烤;如果沒有崩潰日志忱屑,試試點擊Refresh按鈕刷新一下。如果你的應(yīng)用用戶量還不多暇昂,或者剛上架不久莺戒,iTunes Connect賬號上也可能還沒有任何崩潰日志;如果有的話你就會看到不同iOS版本用戶下的崩潰信息急波。
2.crash日志分析
一从铲、如何獲得crash日志
當一個iOS應(yīng)用程序崩潰時,系統(tǒng)會創(chuàng)建一份crash日志保存在設(shè)備上澄暮。這份crash日志記錄著應(yīng)用程序崩潰時的信息名段,通常包含著每個執(zhí)行線程的棧調(diào)用信息(低內(nèi)存閃退日志例外),對于開發(fā)人員定位問題很有幫助泣懊。
如果設(shè)備就在身邊伸辟,可以連接設(shè)備,打開Xcode - Window - Organizer嗅定,在左側(cè)面板中選擇Device Logs(可以選擇具體設(shè)備的Device Logs或者Library下所有設(shè)備的Device Logs)自娩,然后根據(jù)時間排序查看設(shè)備上的crash日志用踩。這是開發(fā)渠退、測試階段最經(jīng)常采用的方式。
如果應(yīng)用程序已經(jīng)提交到App Store發(fā)布脐彩,用戶已經(jīng)安裝使用了碎乃,那么開發(fā)者可以通過iTunes Connect(Manage Your Applications - View Details - Crash Reports)獲取用戶的crash日志。不過這并不是100%有效的惠奸,而且大多數(shù)開發(fā)者并不依賴于此梅誓,因為這需要用戶設(shè)備同意上傳相關(guān)信息。
考慮到并不是所有iPhone用戶都允許自動發(fā)送診斷報告(crash日志)佛南,而且對于部分提交到Apple得crash日志梗掰,開發(fā)者還需要手動去拉取,然后找到對應(yīng)的符號文件進行解析——這是一件很繁瑣的事情嗅回。所以實際項目開發(fā)中及穗,通常接入現(xiàn)有的crash收集工具,或者自己編寫一個進行自動化收集绵载、解析和統(tǒng)計匯總埂陆。
二苛白、如何解析crash日志
當獲得一份crash日志時,我們需要將初始展示的十六進制地址等原始信息映射為源代碼級別的方法名稱和代碼行數(shù)焚虱,使其對開發(fā)人員可讀购裙。這個過程稱為符號化解析。要成功地符號化解析一份crash日志鹃栽,我們需要有對應(yīng)的應(yīng)用程序二進制文件以及符號(.dSYM)文件躏率。
如果處于開發(fā)調(diào)試階段,通常Xcode都能匹配到crash日志對應(yīng)的二進制文件和符號文件民鼓,所以能夠幫我們自動解析禾锤。
如果處于測試階段,測試人員已經(jīng)安裝了不同的版本(比如alpha摹察、beta版本)恩掷,那么需要保存好對應(yīng)版本的二進制文件和符號文件,以便在應(yīng)用程序崩潰時對crash日志進行解析供嚎。對于這種場景下產(chǎn)生的crash日志黄娘,只需要將.crash文件、.app文件和.dSYM文件三者放在同一個目錄下克滴,然后將.crash文件拖放到Xcode - Window - Organizer中左側(cè)面板Library下的Device Logs中逼争,即可進行解析。
如果要提交發(fā)布劝赔,那么我們通常會先執(zhí)行Clean誓焦,再Build,最后通過Product - Archive來打包着帽。這樣杂伟,Xcode會將二進制文件和符號文件歸檔在一起,可以通過Organizer中的Archives進行瀏覽仍翰。
三赫粥、如何分析crash日志
1.iOS策略
1.1 低內(nèi)存閃退
1.2 Watchdog超時
1.3 用戶強制退出
2.常見錯誤標識
2.1 Exception codes
2.2 Exception types
3.代碼bug 重點分析
以上只是列舉了一些crash日志的情況,具體的分析請參考:
http://blog.csdn.net/jasonblog/article/details/19031517
http://www.cocoachina.com/industry/20130725/6677.html
那么予借,比較常見的崩潰基本都源于代碼bug越平,比如數(shù)組越界、插空灵迫、多線程安全性秦叛、訪問野指針、發(fā)送未實現(xiàn)的selector等瀑粥。如果引入Core Data挣跋,則又有另外一些常見問題,不過這是另一個話題了利凑。
遇到這些bug時浆劲,都有比較清楚的錯誤原因說明嫌术,比如“index 0 beyond bounds for empty array”等。需要稍微注意點的是多線程問題牌借,當一時找不到解決思路時度气,不妨往多線程方面考慮下。