脚本处理iOS的Crash日志
背景
当我们打包app时,可以选择生成对应的符号表,其保存 16 进制函数地址映射信息,通过给定的函数起始地址和偏移量,可以对应函数具体信息以供分析。
所以我们拿到测试给的闪退日志(.crash
)时,需要找到打包时对应生成的符号表(.dSYM
)作为钥匙解析。具体分为下面几个步骤
dwarfdump --uuid
命令获取.dSYM
的uuid
打开
.crash
文件,在特定位置找到uuid
根据
arm
版本比对两者是否一致到
Xcode
目录下寻找symbolicatecrash
工具不同版本文件路径不同,具体版本请谷歌。Xcode9路径是/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/
设置终端环境变量
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
使用
symbolicatecrash
工具解析日志
symbolicatecrash .crash .dsym > a.out
虽然过程不复杂,但是每次都需要手动执行一次检查与命令,过于繁琐,所以决定用脚本化提高效率。
步骤实现
输入Crash日志
#要求输入crash文件路径
inputFile 'Please Input Crash File' 'crash'
crashPath=$filePath
由于需要输入两种不同后缀的文件路径,且都需要检查,因此统一定义一个方法。
#定义全局变量
filePath=
#输入文件路径
inputFile() {
readSuccess=false
#首先清空变量值
filePath=
while [ $readSuccess = false ]; do
echo $1
#读取到变量中
read -a filePath
if [[ ! -e $filePath || ${filePath##*.} != $2 ]]; then
echo "Input file is not ."$2
else
readSuccess=true
fi
done
}
.dSYM
是文件夹路径,所以这里简单的判断了路径是否存在,如果不存在就继续让用户输入。
Shell命令中判断分为[]与[[]],后者比前者更通用,可以使用 || 正则运算等。
判断中,-f表示检查是否存在该文件,-d表示检查是否存在文件夹,-e表示检查是否存在该路径
输入dSYM符号表
dsymSuccess=false
while [ $dsymSuccess = false ]; do
#要求输入dSYM文件路径
inputFile 'Please Input dSYM File' 'dSYM'
dsymPath=$filePath
#检查是否匹配
checkUUID "$crashPath" "$dsymPath"
match=$?
if [ $match -eq 0 ]; then
echo 'UUID not match!'
else
dsymSuccess=true
fi
done
循环获取匹配 UUID
的 dSYM
,这里使用了另一种方法获取方法返回值,具体之后章节会总结。
查找symbolicatecrash工具
在 Xcode
文件夹指定路径下查找工具,加快效率,如果没找到就停止运行。
# 查找symbolicatecrash解析工具,内置在Xcode的库文件中
toolPath=`find /Applications/Xcode.app/Contents/SharedFrameworks -name symbolicatecrash | head -n 1`
if [ ! -f $toolPath ]; then
echo "Symbolicatecrash not exist!"
exit 0
fi
执行解析命令
#先设置环境变量
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
#指定解析结果路径
crashName=`basename $crashPath`
afterPath="$(dirname "$crashPath")"/"${crashName%%.*}""_after.crash"
#开始解析
$toolPath "$crashPath" "$dsymPath" > "$afterPath" 2> /dev/null
这里我将错误信息导流到 /dev/null
,保证解析文件没有杂乱信息。
遇到的问题
怎么获取函数返回值?
之前没有处理过需要返回数值的方法,所以一开始有点懵,查询资料后最终采用了两种方式实现了效果,现在做一些总结。
全局变量记录
#定义全局变量
filePath=
inputFile() {
#读取到变量中
read -a filePath
}
inputFile
crashPath=$filePath
通过 inputFile
方法来了解一下,首先定义一个全局变量为 filePath
,在方法中重新赋值,方法结束后读取全局变量中的数据。
这种方法的好处是可以自定义返回参数类型和个数,缺点是容易和其他变量搞混。
Return返回值
类似与C语言中的用法,脚本也支持 retrun 0
返回结果并停止运行。
checkUUID() {
grep "$arm64id" "$1"
if [ $? -ne 0 ]; then
return 1;
fi
return 0;
}
checkUUID "$crashPath" "$dsymPath"
match=$?
获取结果的方式为 $?
,其能够返回环境中最后一个指令结果,也就是之前执行的checkUUID
的结果。
优点是简洁明了,符合编码习惯,缺点是返回值只能是 0-255
的数字,不能返回其他类型的数据。
获取打印值
还有一种方法其实平时一直在使用,只不过并不了解其运行方式。
crashName=`basename $crashPath`
print() {
echo "Hello World"
}
text=$(print)
运行系统预设的方法或者自定义方法,将执行命令用 $()
的方式使用,就可以获取该命令中所有打印的信息,赋值到变量就可以拿到需要的返回值。
优点是功能全效率高,使用字符串的方式可以传递定制化信息,缺点是不可预期返回结果,需要通过字符串查找等命令辅助。
循环输入合法路径
在我的设想中,需要用户输入匹配的 dSYM
文件路径,如果不匹配,则重新输入,直到合法。为了支持嵌套,需要定义局部变量控制循环,具体代码如下
dsymSuccess=false
while [ $dsymSuccess = false ]; do
#要求输入dSYM文件路径
inputFile 'Please Input dSYM File' 'dSYM'
dsymPath=$filePath
#检查是否匹配
checkUUID "$crashPath" "$dsymPath"
match=$?
if [ $match -eq 0 ]; then
echo 'UUID not match!'
else
dsymSuccess=true
fi
done
处理字符串
获取到 UUID
所有输出信息后,需要截取出对应平台的信息,处理还是不太熟悉,特地整理如下
#原始信息
UUID: 92E495AA-C2D4-3E9F-A759-A50AAEF446CD (armv7) /Volumes/.dSYM/Contents/Resources/DWARF/app
UUID: 536527A8-0243-34DB-AE08-F1F64ACA4351 (arm64) /Volumes/.dSYM/Contents/Resources/DWARF/app
#去除中间间隔-
uuid=${uuid//-/}
#从后往前找第一个匹配 \(arm64的,并且都删除
arm64id=${uuid% \(arm64*}
#处理后
UUID: 92E495AAC2D43E9FA759A50AAEF446CD (armv7) /Volumes/.dSYM/Contents/Resources/DWARF/app
UUID: 536527A8024334DBAE08F1F64ACA4351
#从前往后找最后一个UUID: ,并删除
arm64id=${arm64id##*UUID: }
#处理后
536527A8024334DBAE08F1F64ACA4351
总结
看似简单的脚本,也花了一天时间编写,总体还是不太熟练,仍需努力联系。
这次特地尝试了与上次不同的参数输入方法,使用提示输入的方式,果然遇到了新的问题。好在都查资料解决了,结果还算满意。
脚本我提交到了Github,欢迎大家指教共同进步!给个关注最好啦~
脚本处理iOS的Crash日志的更多相关文章
- iOS解析crash日志:
iOS解析crash日志:我们在ios开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应用,或者是rele ...
- 查看iOS应用crash日志
基本操作: 1.电脑安装好Xcode,连接好手机设备 2.打开Xcode,点击Window-Devices and Simulators 3.选中手机设备,点击View Device Logs,即可查 ...
- Crash日志分析
从Crash文件出发解决bug的一般步骤,分三步: a, 获取设备上的崩溃日志. b, 分析崩溃日志,找到报错位置(定位到函数和代码行数). c, 打开代码,改bug. 1, 获取设备日志 1. 在可 ...
- ios crash的原因与抓取crash日志的方法
首先我们经常会闪退的异常有哪些呢?crash的产生来源于两种问题:违反iOS策略被干掉,以及自身的代码bug. 1.IOS策略 1.1 低内存闪退 前面提到大多数crash日志都包含着执行线程的栈调用 ...
- iOS Crash日志
Understanding Crash Reports on iPhone OS https://developer.apple.com/videos/wwdc/2010/?id=317 http:/ ...
- iOS:crash崩溃日志分析
一.前言: 作为一个合格的iOS开发者,除了具有规范强悍的编码能力外,还应该具有过硬的查错纠错能力.在项目运行时,程序崩溃是不可避免的,遇到这个问题,有时会出现一大堆的crash日志,艹,貌似看不懂呀 ...
- iOS应用的crash日志的分析基础
Outline如何获得crash日志如何解析crash日志如何分析crash日志 1. iOS策略相关 2. 常见错误标识 3. 代码bug 一.如何获得crash日志 ...
- iOS crash日志分析
iOS crash日志分析 一. 寻找crash文件:手机崩溃后的ips或者crash文件(ips文件可以直接修改成crash文件,直接改后缀名就可以了),这里说下如何拿到crash文件 1. 把运行 ...
- iOS symbolicatecrash工具crash日志分析
若一个App没有加入Crashlytics或者Buggly这些崩溃日志监控,那么我们在App崩溃的时候如何获取崩溃信息呢? 此时我们可以通过symbolicatecrash工具对手机日志来进行分析定位 ...
随机推荐
- kafka 消费者和生产者测试类
pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www. ...
- dotnet core入门
dotnet 命令 C:\Users\yshuangj\Desktop\dotnet>dotnet Usage: dotnet [options]Usage: dotnet [path-to-a ...
- 「GXOI / GZOI2019」旧词
题目 确定这不是思博题 看起来很神仙,本来以为是\([LNOI2014]LCA\)的加强版,结果发现一个点的贡献是\(s_i\times (deep_i^k-(deep_i-1)^k)\),\(s_i ...
- jquery的fadeTo方法的淡入淡出轮播图插件
由于对基于jquery的简单插件开发有了一定的了解,慢慢的也对基于jquery的插件开发有了兴趣,在上班结束之后就研究各种插件的思路逻辑.最近开发了一款基于jquery的fadeTo方法的轮播图插件, ...
- asp.net Web API简单的特性路由配置
一,控制器代码: [RoutePrefix("ajilisiwei")] //加URL前缀 (非必需) public class ShoppingController : ...
- [USACO09OPEN]Ski Lessons
嘟嘟嘟 先考虑这两点: 1.如果我们有结束时间相同的课程,且达到的能力相同,那么我们一定选择开始时间最晚的. 2.如果有能力值相同的滑雪坡,我们一定选择时间最短的. 因此先预处理两个数组.cla[i] ...
- 使用redis4.0.1和redis-cluster搭建集群并编写重启shell脚本
1.删除机器上原有的redis2.8 关闭redis-server killall -9 redis-server 查找redis文件所在目录 which redis 删除相关文件 rm -rf re ...
- 详解 MNIST 数据集
转自:https://blog.csdn.net/simple_the_best/article/details/75267863 MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它 ...
- Azure云 windows平台 搭建ftp服务器注意事项
1.iis设置防火墙支持端口(1-65535自定义端口,一般3-5个都行) 2.客户端连接使用被动链接模式 3.endpoint终结点添加20,21,以及你自定义的防火墙支持端口. 4.本地防火墙添加 ...
- 【转】如何在VMware上安装macOS Sierra 10.12
本文主要介绍目前网络上比较流行的使用预安装镜像安装macOS 10.12的方法,并以9月20号发布的最新GM版本16A323为例. 安装方案 破解VMware 创建虚拟机,加载预安装镜像 初始化mac ...