EXC_BAD_ACCESS自动处理

我试图build立我自己的信号和iOS的未捕获exception处理程序。 要做到这一点,我使用这两个function:

NSSetUncaughtExceptionHandler(/*handler*/); 

 signal(/*signal const*/, /*signal handler*/); 

我的问题是,我不能让它与EXC_BAD_ACCESS信号工作。 是否有一些信号常量(如SIGABRT,SIGBUS)来捕捉EXC_BAD_ACCESS? 如果不是,我该如何处理? 一些崩溃分析工具(lika PLCrashReporter,Crashlytics等)可以跟踪它…

EXC_BAD_ACCESS不会生成exception,所以您的第一个函数不适用于大小写。 它产生一个信号SIGSEGVSIGBUS

请参阅cocoa爱与处理未处理的exception和信号 。

更新

我刚刚检查了LLDB的源代码。 这可能是TARGET_EXC_BAD_ACCESS = 0x91。

在RNBRemote.h中:

 /* We translate the /usr/include/mach/exception_types.h exception types (eg EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses in include/gdb/signals.h (eg TARGET_EXC_BAD_ACCESS). These hard coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb values in its include/gdb/signals.h. */ #define TARGET_EXC_BAD_ACCESS 0x91 #define TARGET_EXC_BAD_INSTRUCTION 0x92 #define TARGET_EXC_ARITHMETIC 0x93 #define TARGET_EXC_EMULATION 0x94 #define TARGET_EXC_SOFTWARE 0x95 #define TARGET_EXC_BREAKPOINT 0x96 

并在RNBRemote.cpp中:

 // Translate any mach exceptions to gdb versions, unless they are // common exceptions like a breakpoint or a soft signal. switch (tid_stop_info.details.exception.type) { default: signum = 0; break; case EXC_BREAKPOINT: signum = SIGTRAP; break; case EXC_BAD_ACCESS: signum = TARGET_EXC_BAD_ACCESS; break; case EXC_BAD_INSTRUCTION: signum = TARGET_EXC_BAD_INSTRUCTION; break; case EXC_ARITHMETIC: signum = TARGET_EXC_ARITHMETIC; break; case EXC_EMULATION: signum = TARGET_EXC_EMULATION; break; case EXC_SOFTWARE: if (tid_stop_info.details.exception.data_count == 2 && tid_stop_info.details.exception.data[0] == EXC_SOFT_SIGNAL) signum = tid_stop_info.details.exception.data[1]; else signum = TARGET_EXC_SOFTWARE; break; }