`
FIR.im
  • 浏览: 9412 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

iOS错误堆栈查找崩溃原因的方法

阅读更多

作者:崔志伟-FIR.im
BugHD 是 FIR.im 为开发者提供的查找崩溃的工具,一些同学使用后,对于根据错误堆栈查找问题的方法还有一些疑问,现在我用一个FIR.imiOS客户端在BugHD上搜集到的崩溃做例子,带大家了解一下BugHD:

liebiao.png
liebiao.png

我解读一下这份崩溃日志:

进程信息

*** -[__NSArrayI objectAtIndex:]: index 20 beyond bounds [0 .. 0]是闪退进程的相关信息。

  • 崩溃版本: BugHD 会记录崩溃产生的具体的 version 和 build 号,需要了解更多关于版本号管理的同学,可以看一下浅谈 iOS 版本号
  • 崩溃总数: 记录这个原因导致的崩溃总数。
  • 发生设备: 记录遇到这一问题的设备数量。

设备型号

shebei.png
shebei.png

标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。从上图可以看出,发生崩溃的设备为 iPhone4S,iOS 操作系统为 7.1.2。

其他设备信息

qita.png
qita.png

错误堆栈

从错误堆栈中,你可以看到闪退发生时抛出的异常类型,也可以看到异常编码和抛出异常的线程。

0   CoreFoundation                      0x2d6eaf9b  + 154
1   libobjc.A.dylib                     0x37f65ccf objc_exception_throw + 38
2   CoreFoundation                      0x2d621a39  + 176
3   FIR                                 0x000f0e97 FIR + 69271
4   UIKit                               0x2ff0c4ab  + 518
5   UIKit                               0x2ff0c269  + 24
6   UIKit                               0x3009836b  + 634
7   UIKit                               0x2ffb5d63  + 418
8   UIKit                               0x2ffb5b6d  + 44
9   UIKit                               0x2ffb5b05  + 184
10  UIKit                               0x2ff07d59  + 380
11  QuartzCore                          0x2fb8562b  + 142
12  QuartzCore                          0x2fb80e3b  + 350
13  QuartzCore                          0x2fb80ccd  + 16
14  QuartzCore                          0x2fb806df  + 230
15  QuartzCore                          0x2fb804ef  + 314
16  QuartzCore                          0x2fb7a21d  + 56
17  CoreFoundation                      0x2d6b6255  + 20
18  CoreFoundation                      0x2d6b3bf9  + 284
19  CoreFoundation                      0x2d6b3f3b  + 730
20  CoreFoundation                      0x2d61eebf CFRunLoopRunSpecific + 522
21  CoreFoundation                      0x2d61eca3 CFRunLoopRunInMode + 106
22  GraphicsServices                    0x32578663 GSEventRunModal + 138
23  UIKit                               0x2ff6b14d UIApplicationMain + 1136
24  FIR                                 0x000e9743 FIR + 38723
25  libdyld.dylib                       0x38472ab7  + 2

以上的错误堆栈信息是闪退发生时所有活动帧清,它包含闪退发生时调用函数的清单。我们收集到的信息有三种情况:

  1. 已标记错误位置的:

    3   FIR        0x000000010bfddd8c -[FIRViewController viewDidLoad] + 8588
  2. 未标记错误位置,有基地址的情况:

    3   FIR           0x000e3e92 0xd3000 + 69266

    这条调用栈包括下面四部分:

    • 模块号: 这里是3
    • 二进制库名: 这里是 FIR.im
    • 调用方法的地址: 这里是 0x000e3e92
    • 第四部分分为两列,基地址和偏移地址。此处基地址为 0xd3000,偏移地址为 69266。

    使用下面的命令符号化:

    atos -arch armv7 -o FIR -l 0xd3000 0x000e3e92

    结果:

    -[FIRViewController viewDidLoad] (FIRViewController.m:156)

    可以看到崩溃的类为 FIRViewController,函数为 viewDidLoad,文件名是 FIRViewController.m,行数是 156 行。

  3. 未标记错误位置,无基地址的情况:

    3   FIR            0x000f0e97 FIR + 69271

    基地址的计算方法:

    -load address = 0x000f0e97 - 69271 =0xe0000

    使用下面的命令符号化:

    atos -arch armv7 -o FIR -l 0xe0000 0x000f0e97

    结果:

    -[FIRViewController viewDidLoad] (FIRViewController.m:156)

    可以看到崩溃的类为FIRViewController,函数为viewDidLoad,文件名是FIRViewController.m,行数是156行。

    这里我们简单我们看一下 atos 用法:

    atos -o dysm文件路径 -l  模块load地址 -arch cpu 指令集种类 调用方法的地址
    1. dysm 文件路径:可以在 Xcode Organizer 的 Archives 标签栏下找到所有已归档的应用文件。它保存了编译过程的详细信息,其中包括符号信息。
    2. 模块 load 地址:模块加载的基地址,可以在日志的动态库信息中找到对应模块的基地址。这里为 0xd3000
    3. cpu 指令集种类:可以为 armv6 armv7 armv7s arm64。具体用哪个,可以参考对应模块的动态库信息中确定。
1
1
分享到:
评论

相关推荐

    iOS 奔溃代码定位分析工具

    为了解决这个问题,我们需要能够有效地定位和分析崩溃的原因。"iOS崩溃代码定位分析工具"是一个关键的资源,它专门用于处理dSYM文件,帮助开发者迅速定位到导致崩溃的代码行。dSYM文件是苹果为调试目的生成的一种...

    iOS崩溃地址解析到具体的代码

    6. **理解堆栈信息**:解析出的代码行通常能指出问题所在,但有时还需要结合其他信息,如异常类型、崩溃时的变量状态等,才能确定确切原因。可能的问题包括空指针引用、数组越界、内存泄漏、线程竞争等。 总之,iOS...

    iOS crash log

    4. **查找错误代码**:在堆栈跟踪中,可能会看到一些错误代码,比如0x00000bad,这可能是内核返回的错误码。理解这些错误代码的含义有助于定位问题所在。 5. **排查线程信息**:崩溃日志还会包含各个线程的状态,...

    IOS 从容面对奔溃

    LLDB则是一个源代码级别的调试器,可以用来单步执行代码,查看变量状态,设置断点等,对查找和修复崩溃原因非常有帮助。 3. **Exception Breakpoint**:在Xcode中设置异常断点,可以在代码抛出异常时自动停止程序...

    Xcode真机调试iOS14.6

    在实际开发过程中,你可能会遇到各种问题,如权限问题、崩溃日志分析、性能瓶颈查找等,但通过熟练使用Xcode的各种功能,结合苹果的开发者文档,都可以逐步解决。不断实践和学习,是提升iOS开发技能的关键。

    ios-打印log和奔溃日志.zip

    - **奔溃报告**: 当iOS应用崩溃时,系统会生成一个奔溃报告,其中包含了崩溃时的堆栈信息。这些报告有助于开发者识别出导致应用崩溃的具体行数和函数。 - **Exception Breakpoint**: 在Xcode中,可以通过设置...

    ios10.2真机调试包 好用 亲测

    这些工具可以帮助定位问题,比如理解代码执行流程、查找内存泄漏或分析崩溃日志。 对于"10.2 (14C89)"这个文件,它可能是iOS 10.2的一个特定构建版本,可能包含了某些特定的修复或者特性。开发者在使用这个版本进行...

    iOS Crash常规跟踪方法及Bugly集成运用详细介绍

    3. **真机运行**:如果是在未连接Xcode的情况下运行应用,可以通过设备的系统日志(例如使用`Console.app`或`tail -f /var/mobile/Library/Logs/CrashReporter/*.log`)来查找崩溃信息。系统日志通常包含更详细的...

    史上最全ios面试题以及答案

    NSString 的实现需要了解其初始化方法,例如 `+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;` 和 `+ (id)stringWithCString:(const char*)...

    查找EXC_BAD_ACCESS的错误代码处

    ### 查找EXC_BAD_ACCESS错误代码处:利用Instrument工具定位问题 #### 一、引言 在软件开发过程中,特别是iOS应用开发中,经常会遇到难以捉摸的内存管理问题,其中最常见的之一就是`EXC_BAD_ACCESS`错误。这种类型...

    dSYMTools-master

    2. **崩溃日志分析**:当用户在使用iOS App时遇到问题并导致崩溃,系统会生成一份崩溃日志,其中包含堆栈跟踪信息,即一系列调用函数的内存地址。然而,这些地址对开发者来说并不直观,需要通过dSYM文件来解码。 3....

    Crash日志分析

    2. 提供友好的用户界面,简化了日志分析过程,使得非开发人员也能理解崩溃原因。 3. 可能有错误代码匹配库,自动识别常见错误并提供解决方案建议。 4. 支持批量分析,对多个Crash日志进行快速处理。 在实际使用中,...

    iOS断点调试----

    在发生异常时自动暂停程序,有助于调试运行时错误,但不适用于查找因过度释放导致的崩溃。可以通过设置监听特定类型的异常和在抛出或捕获异常时触发。 6. **符号断点**: 基于方法名、函数名或其他符号创建断点,...

    Crash log on target platform

    在IT行业中,错误日志分析是一...通过这些方法,我们可以逐步排查问题,最终定位并修复导致应用崩溃的原因。在这个过程中,细心和耐心是解决问题的关键,同时,不断学习和掌握新的调试技巧也是提升开发能力的重要途径。

    iphone crash符号化工具

    在iOS开发过程中,当应用程序崩溃时,系统会生成一个名为`crash log`的文件,其中包含了大量的十六进制地址和堆栈信息。这些日志对于开发者来说很难直接理解,因为它们没有转换成源代码行。为了将这些崩溃日志转化为...

    如何在xcode里面使用内存泄露查找工具

    如果程序尝试对一个僵尸对象执行消息发送操作,程序会崩溃,并提供详细的错误信息和调用堆栈。 8. 分析Instruments工具提供的报告时,要注意寻找持续占用内存的对象,它们有可能是内存泄露的源头。通过检查这些对象...

    LLDB调试LLDBLLDB

    利用LLDB和符号表信息,分析crash日志以确定崩溃原因,例如通过崩溃堆栈信息定位到出错的代码行。 2.4 观察实例变量的变化 使用LLDB的观察点(watchpoints)来监控特定实例变量的修改。 2.5 打印所有方法进行log...

    dSym分析工具v1.03

    dSym分析工具能够解析这些文件,帮助开发者理解应用的崩溃原因。通过对dSym文件的分析,开发者可以精确地定位到代码中的问题,加速问题的解决过程。 4. **使用流程与优势** 使用dSym分析工具,开发者通常需要先...

    unity 日志插件、导入工程即可使用

    7. **崩溃报告**:如果发生应用崩溃,插件可能能够捕捉到崩溃瞬间的日志,帮助分析崩溃原因。 8. **多设备管理**:对于拥有多个测试设备的开发者,插件可能支持同时连接并查看多个设备的日志。 9. **界面友好**:...

    debug命令大全.pdf

    在计算机编程和系统维护中,debug命令是必不可少的工具,它能帮助开发者查找和修复代码中的错误,优化程序性能。下面我们将详细探讨debug命令的相关知识点。 1. **基本概念**: - Debug:Debug(调试)是指在软件...

Global site tag (gtag.js) - Google Analytics