XCode5环境下利用crash log调试线上Crash的流程
1.前言
本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题。
2. 步骤
(1)构造一段会crash的代码,并放到viewDidLoad里面,如下图所示:
以上代码会在objectAtIndex处因为数组越界而crash
(2)在程序中捕获crash,生成crashlog,并保存到程序自己的沙盒中,如果需要分析线上bug,也可以将log文件上传到自己的服务器中。
捕获crash很简单,主要是以下步骤:
- 在didFinishLaunchingWithOptions 中 调用NSSetUncaughtExceptionHandler (&UnCaughtExceptionHandler),传入一个C函数的地址,这样,当发生crash时,系统会调用该函数。
此C函数的原型为void UnCaughtExceptionHandler(NSException *exception);
- 在UnCaughtExceptionHandler函数中,根据参数exception中的信息,可以得到crash 的callStackSymbols,callStackReturnAddresses,reason,name,然后将这些内容保存到log文件中。
代码如下:
(3) 打包生成.ipa文件
选择Xcode菜单- Product - Archive ,在弹出的Organize-Archives界面中选择Distribute - Save for enterprise or Ad hoc ,然后选择对应的profile文 件,最后导出为ipa文件,该ipa文件可以用同步助手等工具安装到带有描述文件的iOS设备上。
(4)找到dysm符号文件
使用Finder前往路径~/Library/Developer/Xcode/Archives/,可以看到日期目录,目录下有后缀名为xcarchive的文件,选中该文件,右键菜单选择“显示包内容”,可以看到一个dsYMs目录,将目录中的XXX.app.dsYM文件拷出来,后面分析会用到。
(5)
在设备上运行安装的app,app会在viewdidload的时候crash,然后生成crash log,存放到document中。使用工具将crash log复制出来,内容如下:
=====================Crash Report For Iphone=====================
Date:
2013年11月26日星期二 中国标准时间下午2时02分57秒
Name:
NSRangeException
main function address:
0xb6add
Reason:
*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]
CallStackSymbols:
0 CoreFoundation 0x322112bb <redacted> + 186
1 libobjc.A.dylib 0x39f2e97f objc_exception_throw + 30
2 CoreFoundation 0x3215be8d <redacted> + 164
3 CrashLogSample 0x000b6a23 CrashLogSample + 23075
4 CrashLogSample 0x000b69b9 CrashLogSample + 22969
5 UIKit 0x34038595 <redacted> + 364
6 UIKit 0x34078d79 <redacted> + 64
7 UIKit 0x34074aed <redacted> + 364
8 UIKit 0x340b61e9 <redacted> + 60
9 UIKit 0x3407983f <redacted> + 1666
10 UIKit 0x3407184b <redacted> + 698
11 UIKit 0x34019c39 <redacted> + 1004
12 UIKit 0x340196cd <redacted> + 72
13 UIKit 0x3401911b <redacted> + 6154
14 GraphicsServices 0x35d2f5a3 <redacted> + 590
15 GraphicsServices 0x35d2f1d3 <redacted> + 34
16 CoreFoundation 0x321e6173 <redacted> + 34
17 CoreFoundation 0x321e6117 <redacted> + 138
18 CoreFoundation 0x321e4f99 <redacted> + 1384
19 CoreFoundation 0x32157ebd CFRunLoopRunSpecific + 356
20 CoreFoundation 0x32157d49 CFRunLoopRunInMode + 104
21 UIKit 0x34070485 <redacted> + 668
22 UIKit 0x3406d301 UIApplicationMain + 1120
23 CrashLogSample 0x000b6b23 CrashLogSample + 23331
24 CrashLogSample 0x000b6978 CrashLogSample + 22904
CallStackReturnAddress:
841028259
972220799
840285837
748067
747961
872646037
872910201
872893165
873161193
872912959
872880203
872520761
872519373
872517915
903017891
903016915
840851827
840851735
840847257
840269501
840269129
872875141
872862465
748323
747896
(6)根据以上crash log和符号文件来定位crash在源代码中的位置
- 在以上crash log中,可以看出crash类型是NSRangeException,即数组越界
- 在CallStackSymbols那一栏中,可以看到程序crash时的调用栈,其中CrashLogSample表示本App。在其中的第4行,可以看到
3 CrashLogSample 0x000b6a23 CrashLogSample + 23075
这行语句表示崩溃发生时用户代码的地址,但是并不能直接用地址0x000b6a23去符号文件中定位,而是要用以下方式定位:
将该行语句中的23075由10进制转换为16进制,即 0x5a23, 然后加上0x4000,得到0x 9a23。 使用命令行工具进入之前符号文件的目录,输入以下命令,其中crashlogsample应换成自己App的名字。
atos -o ‘CrashLogSample.app.dSYM/Contents/Resources/DWARF/CrashLogSample' -arch armv7 0x9a23
输出结果为:
-[ViewController test] (in CrashLogSample) (ViewController.m:30)
如图所示:
对比之前的代码:
可以看到已经将crash定位到了ViewController.m文件中的30行。
3.备注
本文叙述的流程主要适用于XCode5环境下,对于XCode4的情况,情况略有不同,不过XCode4基本上过时,因此不再详述。
==========================华丽的分割线==============================
日剧高手是一个根据剧照猜剧名的App,App向用户提供日剧的剧照,由用户来选择答
案。
系统里面现在包含三百部日剧的剧照,如果你想知道自己的日剧水平怎么样,就来挑战
下吧 O(∩_∩)O~
下载地址:
https://itunes.apple.com/cn/app/ri-ju-gao-shou/id889031444?mt=8
--
XCode5环境下利用crash log调试线上Crash的流程的更多相关文章
- 利用Chrome浏览器调试线上代码
前言 之前调试前端bug都是在开发环境中做完并多次测试没有问题之后发布测试环境,验收合格之后发布生产.但生产环境偏偏会有和开发和测试环境不一致的情况,例如测试环境需要加密,而开发环境先不加密,测试环境 ...
- 在windows环境下部署nuxt项目(线上发布部署)
因为公司项目需要兼容SEO,同时我们也一直希望能够真正的实现前后端分离,于是毫不犹豫的选择了nuxt. 话说要重构前后端分离真是一个大工程,由于各种原因我们团队花了近两年时间都没有完成,最近才又重启把 ...
- 【原创】K8S环境下研发如何本地调试?kt-connect使用详解
K8S环境下研发如何本地调试?kt-connect使用详解 背景 注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读. 2019年 我在的公司当时是个什么情况,只有两个J ...
- Windows环境下利用github快速配置git环境
在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的win ...
- 如何使用Fiddler调试线上JS代码
大家平时肯定都用过火狐的Firebug或者谷歌的调试工具来调试JS,但遗憾的是我们不能像编辑html,css那样来直接新增或者删除JS代码. 虽然可以通过调试工具的控制台来动态执行JS代码,但有时候却 ...
- chrome浏览器调试线上文件映射本地文件
chrome浏览器调试线上文件映射本地文件 通过ReRes让chrome拥有路径映射的autoResponse功能. 前端开发过程中,经常会有需要对远程环境调试的需求.比如,修改线上bug,开发环境不 ...
- Windows环境下用C#编程将文件上传至阿里云OSS笔记
Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...
- 如何利用docker 构建golang线上部署环境
公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...
- Oracle RAC 环境下的 v$log v$logfile
通常情况下,在Oracle RAC 环境中,v$视图可查询到你所连接实例的相关信息,而gv$视图则包含所有实例的信息.然而在RAC环境中,当我们查询v$log视图时说按照常理的话,v$log视图应当看 ...
随机推荐
- List根据多个字段分组
List<ClassEntity> distinctClass = classEntities.stream().collect(Collectors.collectingAndThen( ...
- web手工项目02-注册功能输入分析,处理,输出方法-测试用例及缺陷编写-首页轮播图和购物车
web手工项目第二天笔记 昨日回顾 搭建测试环境(WAMP,phpStudy,tpshop项目文件) 熟悉项目(四个步骤,三个来源) 项目测试流程(需求评审,测试计划与方案,测试用例设计与评审,测试执 ...
- iOS 字符串和图片互转
for (UIImage *myImg in _imgArray) { NSData *imageData = UIImageJPEGRepresentation(myImg,0.5); NSStri ...
- Java RSA分段加密
我们通过Java进行RSA加密的时候,可能会出现如下问题: /** * 私钥加密 * * @param data 待加密数据 * @param key 密钥 * @return byte[] 加密数据 ...
- pyenv管理python版本
一.介绍 pyenv 是 Python 版本管理工具. pyenv 可以改变全局的 Python 版本,安装多个版本的 Python, 设置目录级别的 Python 版本,还能创建和管理 virtua ...
- 【C#设计模式3】工厂方法模式
一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...
- Efcore迁移
Efcore迁移 Add-Migration XX:1.根据模型的实际结构对比当前快照,从而生成新迁移文件的Up和Down方法2.根据模型的实际结构修改快照和新迁移文件---------------- ...
- Redis源码解析
一.src/server.c 中的redisCommandTable列出的所有redis支持的命令,其中字符串命令包括从get到mget:列表命令从rpush到rpoplpush:集合命令包括从sad ...
- python数据结构_递归_汉诺塔问题
已经不是第一次写这个汉诺塔问题, 其实递归还真是不太好理解, 因为递归这种是想其实有点反人类, 为什么? 因为不太清楚, 写个循环一目了然, 用递归其实要把核心逻辑理清楚, 要不根本没法进行下去 所有 ...
- php 将图片文件转成base64编码的方法
php 将图片文件转成base64编码的方法<pre><?php /** 文件转base64输出 * @param String $file 文件路径 * @return Strin ...