ios - EXC_BAD_ACCESS 自动处理

标签 ios xcode exception-handling exc-bad-access crash-reports

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

NSSetUncaughtExceptionHandler(/*handler*/); 

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

我的问题是我无法让它与 EXC_BAD_ACCESS 信号一起工作。是否有一些信号常量(如 SIGABRT、SIGBUS)来捕获 EXC_BAD_ACCESS?如果没有,我该如何处理?一些崩溃分析工具(例如 PLCrashReporter、Crashlytics 等)可以跟踪它...

最佳答案

EXC_BAD_ACCESS 不会生成异常,因此您的第一个函数不适用于这种情况。它生成信号 SIGSEGVSIGBUS

请引用Handling unhandled exceptions and signals作者 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

在 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;
}

关于ios - EXC_BAD_ACCESS 自动处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10315526/

相关文章:

ios - CorePlot axisLine和gridLine的长度太长

.net - 为什么 AppDomain 异常总是会终止应用程序?

ajax - ajax请求中的angularjs错误处理

ios - 在 Ionic 4 的应用程序中打开 facebook 链接在 iOS 中不工作(在 Android 中工作)

ios - 一起使用 Nib 和 Storyboard : connect the nib's button target/action to a controller from the storyboard

ios - Xcode 6.3.2 无法在 OSX 10.11 El Capitan Developer Preview 3 上运行

c++ - 第一次尝试构建通用单链表,报undefined symbols错误

xcode - 如何一次展开 plist 的所有(或选定的后代)节点?

database - 我可以在 PostgreSQL 的异常中参数化 SQLSTATE

iOS:如何在 UISearchDisplayController 中的 searchBar 上添加 View ,我希望 View 位于 _UISearchDisplayControllerDimmingView 之上