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

liebiao.png
我解读一下这份崩溃日志:
进程信息
*** -[__NSArrayI objectAtIndex:]: index 20 beyond bounds [0 .. 0]
是闪退进程的相关信息。
- 崩溃版本: BugHD 会记录崩溃产生的具体的 version 和 build 号,需要了解更多关于版本号管理的同学,可以看一下浅谈 iOS 版本号。
- 崩溃总数: 记录这个原因导致的崩溃总数。
- 发生设备: 记录遇到这一问题的设备数量。
设备型号

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

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
以上的错误堆栈信息是闪退发生时所有活动帧清,它包含闪退发生时调用函数的清单。我们收集到的信息有三种情况:
-
已标记错误位置的:
3 FIR 0x000000010bfddd8c -[FIRViewController viewDidLoad] + 8588
-
未标记错误位置,有基地址的情况:
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 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 指令集种类 调用方法的地址
- dysm 文件路径:可以在 Xcode Organizer 的 Archives 标签栏下找到所有已归档的应用文件。它保存了编译过程的详细信息,其中包括符号信息。
- 模块 load 地址:模块加载的基地址,可以在日志的动态库信息中找到对应模块的基地址。这里为 0xd3000
- cpu 指令集种类:可以为 armv6 armv7 armv7s arm64。具体用哪个,可以参考对应模块的动态库信息中确定。
相关推荐
为了解决这个问题,我们需要能够有效地定位和分析崩溃的原因。"iOS崩溃代码定位分析工具"是一个关键的资源,它专门用于处理dSYM文件,帮助开发者迅速定位到导致崩溃的代码行。dSYM文件是苹果为调试目的生成的一种...
6. **理解堆栈信息**:解析出的代码行通常能指出问题所在,但有时还需要结合其他信息,如异常类型、崩溃时的变量状态等,才能确定确切原因。可能的问题包括空指针引用、数组越界、内存泄漏、线程竞争等。 总之,iOS...
4. **查找错误代码**:在堆栈跟踪中,可能会看到一些错误代码,比如0x00000bad,这可能是内核返回的错误码。理解这些错误代码的含义有助于定位问题所在。 5. **排查线程信息**:崩溃日志还会包含各个线程的状态,...
LLDB则是一个源代码级别的调试器,可以用来单步执行代码,查看变量状态,设置断点等,对查找和修复崩溃原因非常有帮助。 3. **Exception Breakpoint**:在Xcode中设置异常断点,可以在代码抛出异常时自动停止程序...
在实际开发过程中,你可能会遇到各种问题,如权限问题、崩溃日志分析、性能瓶颈查找等,但通过熟练使用Xcode的各种功能,结合苹果的开发者文档,都可以逐步解决。不断实践和学习,是提升iOS开发技能的关键。
- **奔溃报告**: 当iOS应用崩溃时,系统会生成一个奔溃报告,其中包含了崩溃时的堆栈信息。这些报告有助于开发者识别出导致应用崩溃的具体行数和函数。 - **Exception Breakpoint**: 在Xcode中,可以通过设置...
这些工具可以帮助定位问题,比如理解代码执行流程、查找内存泄漏或分析崩溃日志。 对于"10.2 (14C89)"这个文件,它可能是iOS 10.2的一个特定构建版本,可能包含了某些特定的修复或者特性。开发者在使用这个版本进行...
3. **真机运行**:如果是在未连接Xcode的情况下运行应用,可以通过设备的系统日志(例如使用`Console.app`或`tail -f /var/mobile/Library/Logs/CrashReporter/*.log`)来查找崩溃信息。系统日志通常包含更详细的...
NSString 的实现需要了解其初始化方法,例如 `+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;` 和 `+ (id)stringWithCString:(const char*)...
### 查找EXC_BAD_ACCESS错误代码处:利用Instrument工具定位问题 #### 一、引言 在软件开发过程中,特别是iOS应用开发中,经常会遇到难以捉摸的内存管理问题,其中最常见的之一就是`EXC_BAD_ACCESS`错误。这种类型...
2. **崩溃日志分析**:当用户在使用iOS App时遇到问题并导致崩溃,系统会生成一份崩溃日志,其中包含堆栈跟踪信息,即一系列调用函数的内存地址。然而,这些地址对开发者来说并不直观,需要通过dSYM文件来解码。 3....
2. 提供友好的用户界面,简化了日志分析过程,使得非开发人员也能理解崩溃原因。 3. 可能有错误代码匹配库,自动识别常见错误并提供解决方案建议。 4. 支持批量分析,对多个Crash日志进行快速处理。 在实际使用中,...
在发生异常时自动暂停程序,有助于调试运行时错误,但不适用于查找因过度释放导致的崩溃。可以通过设置监听特定类型的异常和在抛出或捕获异常时触发。 6. **符号断点**: 基于方法名、函数名或其他符号创建断点,...
在IT行业中,错误日志分析是一...通过这些方法,我们可以逐步排查问题,最终定位并修复导致应用崩溃的原因。在这个过程中,细心和耐心是解决问题的关键,同时,不断学习和掌握新的调试技巧也是提升开发能力的重要途径。
在iOS开发过程中,当应用程序崩溃时,系统会生成一个名为`crash log`的文件,其中包含了大量的十六进制地址和堆栈信息。这些日志对于开发者来说很难直接理解,因为它们没有转换成源代码行。为了将这些崩溃日志转化为...
如果程序尝试对一个僵尸对象执行消息发送操作,程序会崩溃,并提供详细的错误信息和调用堆栈。 8. 分析Instruments工具提供的报告时,要注意寻找持续占用内存的对象,它们有可能是内存泄露的源头。通过检查这些对象...
利用LLDB和符号表信息,分析crash日志以确定崩溃原因,例如通过崩溃堆栈信息定位到出错的代码行。 2.4 观察实例变量的变化 使用LLDB的观察点(watchpoints)来监控特定实例变量的修改。 2.5 打印所有方法进行log...
dSym分析工具能够解析这些文件,帮助开发者理解应用的崩溃原因。通过对dSym文件的分析,开发者可以精确地定位到代码中的问题,加速问题的解决过程。 4. **使用流程与优势** 使用dSym分析工具,开发者通常需要先...
7. **崩溃报告**:如果发生应用崩溃,插件可能能够捕捉到崩溃瞬间的日志,帮助分析崩溃原因。 8. **多设备管理**:对于拥有多个测试设备的开发者,插件可能支持同时连接并查看多个设备的日志。 9. **界面友好**:...
在计算机编程和系统维护中,debug命令是必不可少的工具,它能帮助开发者查找和修复代码中的错误,优化程序性能。下面我们将详细探讨debug命令的相关知识点。 1. **基本概念**: - Debug:Debug(调试)是指在软件...