前言
在日常开发中难免遇到程序崩溃的时候,若在Dev环境下通过编译器便能很容易定位到崩溃代码处,但是若版本发布在正式环境里(包括Adhoc和distrubute),我们便无法直接定位到崩溃代码处了。此刻app里的统计平台反馈给我们的是一段没有可读性的日志。那么如何高效、快速、准确地解析日志以便我们快速定位到问题代码?
一、所需文件
-
崩溃日志文件
我们公司使用的是talkingData统计分析平台,故在网站平台可以看到详细的日志记录,平台上还能看到具体是哪一个版本的APP崩溃。从网站平台下载下来的日志文件为csv格式。
符号表文件
-
依次点击 Xcode-->Window-->Organizer-->Archives,选中你的项目,右击,点击 “Show in Finder” 便可找到对应的xcarchive文件。
-
选中上面找到的xcarchive文件,右击点击“Show Package Contents”,进入dSYMs便可以看到dSYM文件。
二、解析方式
手动解析
新建文件夹crash,将dSYM文件拷贝至crash文件中,打开"Terminal",cd进入crash目录,输入atos -o
YourAPP
.app.dSYM/Contents/Resources/DWARF/YourAPP
-arch arm64 -l 0x100008000 0x000000010007cf10
0x100008000 :start adress
0x000000010007cf10 : Offset address-
输出结果:
-
自动解析
自动解析其实就是将上述手动解析步骤用脚本来执行,可以看到其结果是一样的。
脚本
自己新建一个.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
本文系作者原创,转载请注明出处。