关于iOS的异常类型(EXC_BAD_ACCESS)学习

2021-05-13  本文已影响0人  双鱼子曰1987

一、概述

“异常”这个词在“崩溃日志”语境下更多与“Mach 异常”(以 EXC_ 为前缀)和 UNIX 信号(如: SIGSEGV, SIGBUS等)相关。

1、UNIX信号,详见Unix_signal

常见的有:

2、Mach 异常,详见 Mach-EXC (sys/osfmk/mach/exception_types.h)的源码文件。

常见的有:

二、EXC_BAD_ACCESS

1、概述

开发中经常遇到EXC_BAD_ACCESS的崩溃信息,如果使用lldb的bt打印堆栈,能对位具体代码是比较容易解决问题的。但也会遇到一些死在系统库,莫名错误引起的,就很难定位和排查问题。
它到底是什么问题引起的呢?具体要怎么分析?从哪里入手分析呢?带着疑问,找资料,学习汇总,以便查阅。

苹果官方给出EXC_BAD_ACCESS的解释是,其是一个能被捕获语言异常,是关于内存访问方面的错误。
the EXC_BAD_ACCESS exception rules out that a crash is due to an uncaught language exception.
The crash is due to a memory access issue.

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000011

我们发现EXC_BAD_ACCESS(code=2, address=0x13001c040)错误信息给出两个字段,一个是address代表出错的内存地址;code是啥意思呢?

2、EXC_BAD_ACCESS常见的错误子类型

上面错误中这个code代表的是异常的子类型,具体是啥呢?常见有以下几种,详见源码

Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x6d783f44

经常导致的原因就是访问某些尚未初始化的对象(SIGBUS) ,如下

Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000011

3、如何定位EXC_BAD_ACCESS更多信息

三、EXC_CRASH(异常跳出)

Exception Type: EXC_CRASH (SIGABRT)
Exception Subtype: LAUNCH_HANG
Exception Message: The extension took too much time to initialize

四、EXC_RESOURCE

“EXC_RESOURCE”意思是进程“达到资源消耗上限”。通常,当你的应用在一定时间内持续超出限制时会被触发。
这个异常包含“Exception Subtype”以帮助理解实际情况:

Exception Type: EXC_RESOURCE
Exception Subtype: CPU
Exception Message: (Limit 50%) Observed 85% over 180 secs
---
Exception Type: EXC_RESOURCE
Exception Subtype: WAKEUPS
Exception Message: (Limit 150/sec) Observed 206/sec over 300 secs
---
Exception Type: EXC_RESOURCE
Exception Subtype: MEMORY
Exception Message: Crossed High Water Mark

五、00000020

与“EXC_”异常不同,这个“异常类型”实际上不能告诉你任何信息。取而代之,你应该查看“异常代码”获取更多详情。


参考

在exc_bad_access中,代码=1和代码=2有什么区别?
Diagnosing Issues Using Crash Reports and Device Logs
Understanding the Exception Types in a Crash Report
Investigating Memory Access Crashes
译:理解 iOS 异常类型
iOS Abort问题系统性解决方案

上一篇 下一篇

猜你喜欢

热点阅读