crash 日志产生的两种原因
- 违反 iOS 策略
- 代码所出现的 bug
常见的Exception Type & Exception Code
Exception Type
-
EXC_BAD_ACCESS
通常用于访问了不改访问的内存导致。
- SIGSEGV: 通常由于重复释放对象导致,这种类型在切换了ARC以后应该已经很少见到了。
- SIGABRT: 收到Abort信号退出,通常Foundation库中的容器为了保护状态正常会做一些检测,例如插入nil到数组中等会遇到此类错误。
- SEGV:(Segmentation Violation),代表无效内存地址,比如空指针,未初始化指针,栈溢出等;
- SIGBUS:总线错误,与 SIGSEGV 不同的是,SIGSEGV 访问的是无效地址,而 SIGBUS 访问的是有效地址,但总线访问异常(如地址对齐问题)
- SIGILL:尝试执行非法的指令,可能不被识别或者没有权限。
-
EXC_BAD_INSTRUCTION
此类异常通常由于线程执行非法指令导致。
-
EXC_ARITHMETIC
除零错误会抛出此类异常。
-
EXC_BREAKPOINT//SIGTRAP
与异常退出类似,如果存在debugger,则它被唤起;否则,则与异常退出的处理一致。
-
EXC_GUARD
访问非法资源,例如:文件描述符已经被关闭,还继续访问。
-
EXC_RESOURCE
达到资源访问上限,这不是崩溃,而是os发出的一个通知
具体操作
- 从崩溃系统把相关文件下载下来,.crash 文件和 .dSYM 文件
- 使用命令解析
cp /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Users/Loong/Downloads/kiwi/dSYMs
./symbolicatecrash kiwi-2017-11-11-151231.crash /Users/Loong/Downloads/kiwi/dSYMs/kiwi.app.dSYM > kiwi.crash
export DEVELOPER_DIR="/Applications/XCode.app/Contents/Developer"
参考文章: