EXC_BAD_ACCESS自动处理

ani*_*hin 13 xcode exception-handling exc-bad-access crash-reports ios

我正在尝试为iOS构建自己的信号和未捕获的异常处理程序.为此,我使用以下两个函数:

NSSetUncaughtExceptionHandler(/*handler*/); 
Run Code Online (Sandbox Code Playgroud)

signal(/*signal const*/, /*signal handler*/);
Run Code Online (Sandbox Code Playgroud)

我的问题是我无法使用EXC_BAD_ACCESS信号.是否有一些信号常量(如SIGABRT,SIGBUS)来捕获EXC_BAD_ACCESS?如果不是,我该如何处理?一些崩溃分析工具(lika PLCrashReporter,Crashlytics等)可以追踪它......

Hai*_*lei 8

EXC_BAD_ACCESS不生成异常,因此您的第一个函数不适用于该情况.它产生一个信号SIGSEGVSIGBUS.

请参阅Cocoa with Love 处理未处理的异常和信号.

更新

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

在RNBRemote.h中:

/* We translate the /usr/include/mach/exception_types.h exception types
   (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses
   in include/gdb/signals.h (e.g. 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
Run Code Online (Sandbox Code Playgroud)

在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 它的工作原理!:)非常感谢你... :)问题真的是用gdb运行应用程序,当我从xcode断开它并在iPhone上运行它时它正确地捕获了EXC_BAD_ACCESS信号.另一个问题是1 EXC_BAD_ACCES生成aprox.30个信号都是相同的,所以我必须将它减少到只有1.但那样就可以了.所以再一次...谢谢你的时间,你真的帮了我很多:) (4认同)