iOS crash 追终 ,iOS 如何定位crash 位置
https://developer.apple.com/library/ios/technotes/tn2151/_index.html
错误分析是基于设备中的crash log 与 编译文件时生成的dsYM文件相结合得出的结果,crash log 中包含应用的 crash trace stack,dsym中包含应用的符号表信息,符号表信息用于匹配程序中的文件,函数,代码,行号。
一、可用crash trace 追踪的crash
二、low memery 是追踪不到的因为没有对应以下的这类型的符号
1)EXC_BAD_ACCESS
SIGSEGV: 通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。
SIGABRT: 收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。
SEGV:(Segmentation Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出等;
SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常(如地址对齐问题)
SIGILL:尝试执行非法的指令,可能不被识别或者没有权限
2)EXC_BAD_INSTRUCTION
3)EXC_ARITHMETIC
不用第三方工具,如何分析?
首先,确保在release(Ad Hoc或者App Store)一个版本时,保存了对应的xxx.app和xxx.dSYM文件。
其次,验证xxx.crash、xxx.app和xxx.dSYM三者的uuid是否一致。
验证方法:
1)xxx.app。dwarfdump --uuid mobileguard.app/mobileguard
2)xxx.dSYM。dwarfdump --uuid mobileguard.app.dSYM/Contents/Resources/DWARF/mobileguard
3)xxx.crash。
确保三者uuid一致以后,用symbolicatecrash工具生成易读的日志信息。
先准备环境:
1)链接symbollicatecrash到/usr/bin/中,就可以直接使用sybollicatecrash命令。ln -s /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash /usr/bin/symbolicatecrash
2)设置xcode DEVELOPER_DIR。export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer”
然后执行命令:symbolicatecrash m.crash mobileguard.app.dSYM > n.crash
当然是有 分析工具可以用的:
Crashlystics (twitter,使用自动集成工具,通过上传dsym文件形式,强烈推荐使用,简单,好用,定位问题快,准)
Bugly (腾讯,用相应的jar 将dsym分析后上传至腾讯服务器)
MoClick (友盟,需下载crash log 并用相应的工具解析)
Hockeyapp (微软,需上传dsym文件,收费,有自动集成工具)