XCode5环境下利用crash log调试线上Crash的流程

2024-03-04 13:58

本文主要是介绍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 的callStackSymbolscallStackReturnAddresses,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基本上过时,因此不再详述。

这篇关于XCode5环境下利用crash log调试线上Crash的流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773393

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

安装nodejs环境

本文介绍了如何通过nvm(NodeVersionManager)安装和管理Node.js及npm的不同版本,包括下载安装脚本、检查版本并安装特定版本的方法。 1、安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash 2、查看nvm版本 nvm --version 3、安装

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get