iOS通过dSYM文件分析crash
重点是dwarfdump --uuid命令
我们在iOS开发中会碰到的很多crash问题,如果Debug调试模式的话,我们可以往往很容易的根据log的输出定位到导致crash的原因,但对于已经上线的应用,或者是release环境包导致的crash,我们就需要一些特殊的手段来通过crash log进行分析定位了。
通过参考网上的一些资料,总结了一下,下面介绍一下通过dSYM文件以及crash log分析定位的方法。
1.导出crash log
通过Xcode的Organizer查看某台iphone设备的DeviceLog,选择需要的crash log,导出XXX.crash文件。
2.找到对应的app文件
找到当前iphone设备上安装的ipa文件,更改文件后缀名为zip,解压后得到Payload文件夹,你需要的app文件就在其中了。
3.找到对应build版本的dSYM文件
dSYM文件是iOS编译后保存16进制函数地址映射信息的文件,每次应用程序build后,都会生成对应的xxx.app, xxx.app.dSYM文件。
4.确定dSYM、app以及crash文件的关系
每一个xx.app, xxx.app.dSYM文件都拥有相应的uuid,crash文件也有uuid,只有三者uuid一至才表明之三者可以解析出正确的日志文件。
查看xx.app文件的uuid的方法,在terminal中输入命令:
dwarfdump --uuid xxx.app/xxx (xxx工程名)
查看xx.app.dSYM文件的uuid的方法,在terminal中输入命令:
dwarfdump --uuid xxx.app.dSYM (xxx工程名)
而.crash的uuid位于,crash日志中的Binary Images:中的第一行尖括号内。如:
armv7 <8bdeaf1a0b233ac199728c2a0ebb4165>
将对应的xxx.app.dSYM文件以及xxx.app文件以及xxx.crash文件拷贝到同一文件夹中,如:~/Desktop/DebugLog。
5.通过symbolicatecrash分析crash文件
Xcode有自带的symbolicatecrash工具,可以通过dSYM文件将crash文件中的16进制地址转换成可读的函数地址。symbolicatecrash工具位于:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash(Xcode 4.5)
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash(Xcode 5.0)
该文件是隐藏文件,可以通过如下命令查找并拷贝到系统目录下,并建立快捷方式。
1)打开终端,进入到symbolicatecrash工具所在的文件夹目录
cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/
2)查找确认是否存在symbolicatecrash
ls -al | grep symbolicatecrash
3)将symbolicatecrash工具拷贝到/usr/bin目录下
sudo cp symbolicatecrash /usr/bin/symbolicatecrash
4)设置DEVELOPER_DIR系统变量
cd ~/
vi .bash_profile
并输入如下内容
export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer"
保存并退出
source .bash_profile
5)重启终端,确认是否已正确设置DEVELOPER_DIR系统变量
echo $DEVELOPER_DIR
查看输出结果是否为/Applications/Xcode.app/Contents/Developer
6)查看PATH系统变量是否存在如下路径/usr/bin
echo $PATH
7)如果PATH不存在如下路径/usr/bin,可在~/.bash_profile中添加如下代码
export PATH="/usr/bin:$PATH"
保存并退出
source .bash_profile
8)上述准备工作完成后,进入dSYM和crash文件对应的文件夹目录,如
cd ~/Desktop/DebugLog
9)执行如下命令,即可正确解析crash文件
symbolicatecrash xxx.crash xxx.app.dSYM > test.txt
注意:symbolicatecrash的参数顺序,否则会报类似如下错误
Use of uninitialized value $data in substitution (s///) at /usr/bin/symbolicatecrash line 678.
Use of uninitialized value $data in substitution (s///) at /usr/bin/symbolicatecrash line 681.
Use of uninitialized value $data in substitution (s///) at /usr/bin/symbolicatecrash line 685.
Use of uninitialized value in pattern match (m//) at /usr/bin/symbolicatecrash line 404.
Use of uninitialized value in scalar assignment at /usr/bin/symbolicatecrash line 418.
No crash report version in XXX.app.dSYM/ at /usr/bin/symbolicatecrash line 954.
今天就先到这里,希望对大家有所帮助。
iOS通过dSYM文件分析crash的更多相关文章
- dSYM 文件分析工具
来到新公司后,前段时间就一直在忙,前不久 项目 终于成功发布上线了,最近就在给项目做优化,并排除一些线上软件的 bug,因为项目中使用了友盟统计,所以在友盟给出的错误信息统计中能比较方便的找出客户端异 ...
- dSYM文件分析
什么是 dSYM 文件 Xcode编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且每次编 ...
- macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号
一.使用流程 Windows下的程序运行崩溃时,往往可以利用pdb文件快速解析出程序崩溃的具体位置,甚至可以对应到源代码的具体行数.macOS下的symbolicatecrash也具备相应的功能.对应 ...
- IOS 使用DSYM文件定位Bug 的具体位置
在项目的开发中,我们通常需要排查和修改测试中和发布后线上的一些bug,现在有一些第三方的bug分享和查找工具SDK,如腾讯的Bugly和听云等,包括苹果的开发工具xcode也自带 bug查找工具.那么 ...
- iOS 技术篇: 如何利用dsym文件分析苹果被拒日志
今天提审被拒了.伤心
- 分析Crash文件
应用在没有发布前,可以通过打印log很方便的查看错误信息.但是发布后,就需要根据Crash文件来定位了. 将手机连接电脑,通过XCode获取Crash文件.Window ->Devices -& ...
- iOS symbolicatecrash崩溃日志分析
1.保留发布程序的 .app文件 和 .dSYM文件 连同.crash文件放在同一个文件家里面. 2.在/Applications/Xcode.app/Contents/Developer/Platf ...
- [iOS]使用symbolicatecrash分析crash文件
对于我们iOS开发者来说,最心碎的事莫过于苹果审核一个星期后上架app store,而第二天就报出闪退bug.一周前我刚经历过,而且最坑的是由于第一次做个人开发,经验不足,没有集成友盟的分析SDK,还 ...
- iOS 苹果官方 Crash文件分析方法 (iOS系统Crash文件分析方法)
时间2013-08-20 12:49:20 GoWhich原文 http://www.gowhich.com/blog/view/id/343 苹果官方 Crash文件分析方法 (iOS系统Cras ...
随机推荐
- Django一些技巧
整数限制范围 from django.core.validators import MaxValueValidator, MinValueValidator start = models.Intege ...
- 前端生成二维码 - Javascript生成二维码(QR)
前段时间项目中需要动态的生成二维码,经过评估,前后端生成都可以.但后端生成会有两个问题: 没有找到正规发布出来的后端开源库. 二维码图片,会随着商品的增加而不断变多. 基于以上两个问题,决定在前端生成 ...
- go反射实例
需求分析: 如在rocketmq的网络通信中,所有通信数据包以如下形式传输: (注:rocketmq的java结构体,这里使用了go形式表示) type RemotingCommand struct ...
- android用户登录验证
转自https://www.cnblogs.com/android-blogs/p/5912585.html
- &&与||的短路运算
在谈&&和||两个运算符的短路运算之前,先看一段程序: #include <stdio.h> int main() { , para2 = , para3 = , para ...
- shiro 权限集成Ehcache 配置 学习记录(二)
1.加入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-eh ...
- idea升级maven工程jar包版本和解决jar包冲突
原来用过eclipse的都知道,想要升级maven工程的jar包版本或者解决jar包冲突,直接在pom文件下的dependency hierarchy视图下右击冲突的jar包,将其exclude掉,然 ...
- zigbee广播通信原理
广播:可以理解成,发送模块发出数据,这个网络里的所有节点模块都可以拿到这个数据. 实验:终端模块以广播的形式发送出去,让协调器和路由器模块作为接收器收到数据并显示出来! 协调器模块作为接收模块: 和单 ...
- Smarty的循环
(1)section.sectionelse功能多,参数多.或许不是太实用.是smarty用来做循环操作的函数之一.(2)了解基本属性name和loop <section name=articl ...
- MVC错误(一)
目录规范后将相应的文件放到该放的地方后,应修改require_once();中的路径 调试php代码时先打开WampServer,再在浏览器中输入localhost/文件夹名/index.php