iOS崩潰日誌之手動解析與自動解析

輸入圖片說明

前言

  在平常開發中不免遇到程序崩潰的時候,若在Dev環境下經過編譯器便能很容易定位到崩潰代碼處,可是若版本發佈在正式環境裏(包括Adhoc和distrubute),咱們便沒法直接定位到崩潰代碼處了。此刻app裏的統計平臺反饋給咱們的是一段沒有可讀性的日誌。那麼如何高效、快速、準確地解析日誌以便咱們快速定位到問題代碼?app

[talkingData平臺上的崩潰日誌]網站

輸入圖片說明

1、所需文件

1. 崩潰日誌文件日誌

咱們公司使用的是talkingData統計分析平臺,故在網站平臺能夠看到詳細的日誌記錄,平臺上還能看到具體是哪個版本的APP崩潰。從網站平臺下載下來的日誌文件爲csv格式。code

輸入圖片說明

2. 符號表文件圖片

 2.1 依次點擊 Xcode-->Window-->Organizer-->Archives,選中你的項目,右擊,點擊 「Show in Finder」 即可找到對應的xcarchive文件。開發

 2.2 選中上面找到的xcarchive文件,右擊點擊「Show Package Contents」,進入dSYMs即可以看到dSYM文件。編譯器

2、解析方式

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

本文系做者原創,轉載請註明出處。

相關文章
相關標籤/搜索