在平常開發中不免遇到程序崩潰的時候,若在Dev環境下經過編譯器便能很容易定位到崩潰代碼處,可是若版本發佈在正式環境裏(包括Adhoc和distrubute),咱們便沒法直接定位到崩潰代碼處了。此刻app裏的統計平臺反饋給咱們的是一段沒有可讀性的日誌。那麼如何高效、快速、準確地解析日誌以便咱們快速定位到問題代碼?app
[talkingData平臺上的崩潰日誌]網站
1. 崩潰日誌文件日誌
咱們公司使用的是talkingData統計分析平臺,故在網站平臺能夠看到詳細的日誌記錄,平臺上還能看到具體是哪個版本的APP崩潰。從網站平臺下載下來的日誌文件爲csv格式。code
2. 符號表文件圖片
2.1 依次點擊 Xcode-->Window-->Organizer-->Archives,選中你的項目,右擊,點擊 「Show in Finder」 即可找到對應的xcarchive文件。開發
2.2 選中上面找到的xcarchive文件,右擊點擊「Show Package Contents」,進入dSYMs即可以看到dSYM文件。編譯器
1. 手動解析it
1.1 新建文件夾crash,將dSYM文件拷貝至crash文件中,打開"Terminal",cd進入crash目錄,輸入atos -o YourAPP
.app.dSYM/Contents/Resources/DWARF/YourAPP
-arch arm64 -l 0x100008000 0x000000010007cf10io
1.2 0x100008000 :start adress 0x000000010007cf10 : Offset address編譯
1.3 輸出結果:
2. 自動解析
自動解析其實就是將上述手動解析步驟用腳原本執行,能夠看到其結果是同樣的。
3. 腳本
本身新建一個.sh文件,將腳本文件拷貝到其中,.sh文件中用**#註釋語句,由於#在Markdown語法中有特殊含義,故.sh文件中須要將//換成#**。
// 使用須知 // 1.本身新建一個文件夾,將.xcarchive文件和talkingData上的日誌文件(.csv格式)下載並保存到該目錄 // 2.cd進入該目錄, 運行腳本crash.sh, 腳本可帶參數, 不傳參數時默認是YourAPP, 帶參數時,參數表示其它功能名稱。例如./crash.sh hrloo if [ ! -n "$1" ] ;then xcarchiveName="YourAPP" else xcarchiveName="$1" fi dirs=$(pwd) //-----------------------------------------------// mkdir -p file $dirs/file cd $dirs cp -r ./*.xcarchive $xcarchiveName.xcarchive cd $dirs/"$xcarchiveName".xcarchive/dSYMs cp -r ./$xcarchiveName.app.dSYM $dirs/file cd $dirs cp -r ./*.csv ./file/""$xcarchiveName"log".txt rm -r ./"$xcarchiveName".xcarchive //-------------------deal txt-------------------// cd file grep -e "reason" "$xcarchiveName"log.txt adress=`grep -e "Start Address" "$xcarchiveName"log.txt` for adr in $adress do { if [[ $adr =~ '0x' ]]; then adress=$adr fi } done echo '---------------------------crash begin function-------------------------------\n' result=`grep -e "$xcarchiveName +" "$xcarchiveName"log.txt` while read line do { for var in $line do if [[ $var =~ '0x' ]]; then atos -o $xcarchiveName.app.dSYM/Contents/Resources/DWARF/$xcarchiveName -arch arm64 -l $adress $var fi done } done <<EOF $result EOF echo '----------------------------crash end function---------------------------------\n' cd ../ rm -r file
本文系做者原創,轉載請註明出處。