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的流程的更多相关文章

  1. 利用Chrome浏览器调试线上代码

    前言 之前调试前端bug都是在开发环境中做完并多次测试没有问题之后发布测试环境,验收合格之后发布生产.但生产环境偏偏会有和开发和测试环境不一致的情况,例如测试环境需要加密,而开发环境先不加密,测试环境 ...

  2. 在windows环境下部署nuxt项目(线上发布部署)

    因为公司项目需要兼容SEO,同时我们也一直希望能够真正的实现前后端分离,于是毫不犹豫的选择了nuxt. 话说要重构前后端分离真是一个大工程,由于各种原因我们团队花了近两年时间都没有完成,最近才又重启把 ...

  3. 【原创】K8S环境下研发如何本地调试?kt-connect使用详解

    K8S环境下研发如何本地调试?kt-connect使用详解 背景 注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读. 2019年 我在的公司当时是个什么情况,只有两个J ...

  4. Windows环境下利用github快速配置git环境

    在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的win ...

  5. 如何使用Fiddler调试线上JS代码

    大家平时肯定都用过火狐的Firebug或者谷歌的调试工具来调试JS,但遗憾的是我们不能像编辑html,css那样来直接新增或者删除JS代码. 虽然可以通过调试工具的控制台来动态执行JS代码,但有时候却 ...

  6. chrome浏览器调试线上文件映射本地文件

    chrome浏览器调试线上文件映射本地文件 通过ReRes让chrome拥有路径映射的autoResponse功能. 前端开发过程中,经常会有需要对远程环境调试的需求.比如,修改线上bug,开发环境不 ...

  7. Windows环境下用C#编程将文件上传至阿里云OSS笔记

    Windows环境下用C#编程将文件上传至阿里云OSS笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/detai ...

  8. 如何利用docker 构建golang线上部署环境

    公司最近开发了一个项目是用golang 写的,现在要部署到线上环境去,又不想在服务器上装单独的golang,决定用docker 封装下,直接打到镜像里面,然后就直接在hub.docker.com上面搜 ...

  9. Oracle RAC 环境下的 v$log v$logfile

    通常情况下,在Oracle RAC 环境中,v$视图可查询到你所连接实例的相关信息,而gv$视图则包含所有实例的信息.然而在RAC环境中,当我们查询v$log视图时说按照常理的话,v$log视图应当看 ...

随机推荐

  1. UIFontDownLoad ----动态下载系统提供的字体

    程序运行结果如下 : 当点击对应单元格实现下载对应的字体. 控制台打印结果如下 : 2015-10-05 11:14:04.132 UIFontDownLoad[12721:86827] state ...

  2. nginx利用fastcgi_cache模块缓存

    nginx不仅有个大家很熟悉的缓存代理后端内容的proxy_cache,还有个被很多人忽视的fastcgi_cache.proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和 ...

  3. fiddler https 抓包

    手机上https抓包: http://blog.csdn.net/wangjun5159/article/details/52202059 需要给fiddler安装插件CertMaker for iO ...

  4. python迭代器、生成器、装饰器之装饰器

    装饰器...... 定义:本质是函数,为其他函数添加附加功能 原则: 1.不能修改被装饰的函数的源代码 2.不能修改被装饰函数的调用方式 仔细观察下面代码,看看有什么发现. 内嵌函数+高阶函数+闭包= ...

  5. Python3之错误处理

    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及错误的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描 ...

  6. 单点登录系统(SSO)详细设计说明书(上篇)

    1.引言 1.1编写目的 为了单点登录系统(SSO系统)的可行性,完整性,并能按照预期的设想实现该系统,特编写需求说明书.         同时,说明书也发挥与策划和设计人员更好地沟通的作用. 1.2 ...

  7. python的注释规范

    pydoc是python自带的一个文档生成工具,使用pydoc可以很方便的查看类和方法结构   本文主要介绍:1.查看文档的方法.2.html文档说明.3.注释方法.   一.查看文档的方法 方法1: ...

  8. 案例一:利于Python调用JSON对象来实现对XENA流量测试仪的灵活发包测试,能够适应Pair,Rotate,1-to-Many等多种拓扑模型

    硬件:XENA Valkyrie 或 Vantage主机,测试板卡不限,本方法适用于其100M~400G所有速率端口 环境配置:Python 3 实现功能: 1.控制流量仪进行流量测试,预定配置的流量 ...

  9. SQL查询当天、本周、本月记录详解

    --查询当天: select * from info where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: select * from info wh ...

  10. vbox配置共享磁盘

    本人实在配置Oracle rac的时候,进行共享磁盘的配置 以下操作要在虚拟机关机的情况下进行: 接下来按照步骤走即可