美文网首页iOS技术专题
iOS手动解析崩溃日志(详细过程)

iOS手动解析崩溃日志(详细过程)

作者: Travelcolor | 来源:发表于2021-07-09 15:04 被阅读0次

背景

线上Crash,无法全局打断点。

  • APP集成有友盟统计,后台拿到崩溃日志可进行bug定位
  • 通用性:该方法不局限于友盟统计,适用于大多数第三方SDK收集的崩溃日志

错误摘要:

Application threw exception NSInternalInconsistencyException: Tried to pop to a view controller that doesn't exist.
Originated at or in a subcall of __40-[YQNewPublishController publishRequest]_block_invoke
6 AppName 0x000000010100eef4 0x100fc0000 + 323316

从崩溃日志最后一行可以看到:

  • 起始地址:0x100fc0000
  • 偏移后地址:0x000000010100eef4

仅需两步:

1、打开Xcode,上方菜单栏可以看到Window->Organizer->Archives,找到对应版本,右键点击Show In Finder,可以看到对应的.xcarchive文件,然后右键点击显示包内容,可以看到dYSMs文件夹,拷贝里面的.dYSM文件,存放到新建crash目录下。
2、打开终端Terminal,cd到新建的crash目录下,输入:

atos -o AppName.app.dSYM/Contents/Resources/DWARF/AppName -arch arm64 -l 0x100fc0000 0x000000010100eef4
  • 注意修改其中AppName是咱们的应用名。,展开.app.dSYM包内容,找到最后一级路径拖到atos -o后面即可

打印结果

-[YQDataTeamScoreController requestData] (in ) (YQDataTeamScoreController.m:127)

  • 结果显示crash出现在YQDataTeamScoreController.m的第127行

第二种 新建.sh脚本文件,自动解析crash

自己新建一个.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


参考:https://my.oschina.net/u/3445809/blog/885617

相关文章

网友评论

    本文标题:iOS手动解析崩溃日志(详细过程)

    本文链接:https://www.haomeiwen.com/subject/houtpltx.html