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

本文系做者原创,转载请注明出处。

相关文章
相关标签/搜索