
前言
在日常開發(fā)中難免遇到程序崩潰的時(shí)候,若在Dev環(huán)境下通過編譯器便能很容易定位到崩潰代碼處,但是若版本發(fā)布在正式環(huán)境里(包括Adhoc和distrubute),我們便無法直接定位到崩潰代碼處了。此刻app里的統(tǒng)計(jì)平臺(tái)反饋給我們的是一段沒有可讀性的日志。那么如何高效、快速、準(zhǔn)確地解析日志以便我們快速定位到問題代碼?

一、所需文件
-
崩潰日志文件
我們公司使用的是talkingData統(tǒng)計(jì)分析平臺(tái),故在網(wǎng)站平臺(tái)可以看到詳細(xì)的日志記錄,平臺(tái)上還能看到具體是哪一個(gè)版本的APP崩潰。從網(wǎng)站平臺(tái)下載下來的日志文件為csv格式。
符號(hào)表文件
-
依次點(diǎn)擊 Xcode-->Window-->Organizer-->Archives,選中你的項(xiàng)目,右擊,點(diǎn)擊 “Show in Finder” 便可找到對(duì)應(yīng)的xcarchive文件。
-
選中上面找到的xcarchive文件,右擊點(diǎn)擊“Show Package Contents”,進(jìn)入dSYMs便可以看到dSYM文件。
二、解析方式
手動(dòng)解析
新建文件夾crash,將dSYM文件拷貝至crash文件中,打開"Terminal",cd進(jìn)入crash目錄,輸入atos -o
YourAPP.app.dSYM/Contents/Resources/DWARF/YourAPP-arch arm64 -l 0x100008000 0x000000010007cf10
0x100008000 :start adress
0x000000010007cf10 : Offset address-
輸出結(jié)果:
-
自動(dòng)解析
自動(dòng)解析其實(shí)就是將上述手動(dòng)解析步驟用腳本來執(zhí)行,可以看到其結(jié)果是一樣的。
腳本
自己新建一個(gè).sh文件,將腳本文件拷貝到其中,.sh文件中用#注釋語句,因?yàn)?strong>#在Markdown語法中有特殊含義,故.sh文件中需要將//換成#。
// 使用須知
// 1.自己新建一個(gè)文件夾,將.xcarchive文件和talkingData上的日志文件(.csv格式)下載并保存到該目錄
// 2.cd進(jìn)入該目錄, 運(yùn)行腳本crash.sh, 腳本可帶參數(shù), 不傳參數(shù)時(shí)默認(rèn)是YourAPP, 帶參數(shù)時(shí),參數(shù)表示其它功能名稱。例如./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
本文系作者原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處。




