EXC_BAD_ACCESS中code = 1和code = 2之间的区别是什么?

Ada*_*Lee 17 xcode objective-c

我收到的代码= 1或代码= 2表示EXC_BAD_ACCESS错误.我想知道code = 1和code = 2之间有什么区别?

Mar*_*n R 29

Code = 1是KERN_INVALID_ADDRESS,code = 2是KERN_PROTECTION_FAILURE.两者都在"技术说明TN2123 CrashReporter"中解释:

最常见的例外形式是:

  • EXC_BAD_ACCESS/KERN_INVALID_ADDRESS - 这是由访问未映射内存的线程引起的.它可以由数据访问或取指令触发; 线程状态部分描述了如何区分.
  • EXC_BAD_ACCESS/KERN_PROTECTION_FAILURE - 这是由尝试写入只读内存的线程引起的.这始终是由数据访问引起的.

代码定义<mach/kern_return.h>如下:

#define KERN_INVALID_ADDRESS            1
                /* Specified address is not currently valid.
                 */

#define KERN_PROTECTION_FAILURE         2
                /* Specified memory is valid, but does not permit the
                 * required forms of access.
                 */
Run Code Online (Sandbox Code Playgroud)

并且在<mach/exception_types.h>其中记录了EXC_BAD_ACCESS的代码是kern_return_t:

#define EXC_BAD_ACCESS          1       /* Could not access memory */
                /* Code contains kern_return_t describing error. */
                /* Subcode contains bad memory address. */
Run Code Online (Sandbox Code Playgroud)

  • 用Unix术语来说,它与SIGBUS和SIGSEGV相同。 (2认同)