【问题标题】:EXC_BAD_ACCESS automatic handlingEXC_BAD_ACCESS 自动处理
【发布时间】:2012-05-06 03:06:30
【问题描述】:

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

NSSetUncaughtExceptionHandler(/*handler*/); 

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

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

【问题讨论】:

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


【解决方案1】:

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

请参考Cocoa with Love的Handling unhandled exceptions and signals

更新

我刚刚查看了 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;
}

【讨论】:

  • :) 感谢您的回复!我正在编写本教程中的“模块”,正如我之前已经评论过我的问题,我已经在处理 SIGSEV 和 SIGBUS,但没有运气。我仍然无法处理 EXC_BAD_ACCESS...尝试阅读该教程中的 cmets 关于可可的爱...很少有人遇到与我相同的问题...
  • 谢谢!真的! :) 这显然可以解决这个问题......但我现在有点困惑,因为我是一个新手,我该如何处理它? :) 调用 signal(0x91, /*handler) 没有帮助...我现在一定看起来很蠢 :)
  • 很抱歉听到信号(0x91,处理程序)不起作用......我不确定这些“假 BSD 信号号”实际上是如何工作的,尤其是在调试时(因为调试器可能会一些东西,比如打断等等。)你是在 Xcode 中还是在设备上尝试过这个?
  • PLCrashReporter 处理这些信号:SIGABRT、SIGBUS、SIGFPE、SIGILL、SIGSEGV、SIGTRAP,请参阅code.google.com/p/plcrashreporter/source/browse/trunk/Source/…。根据mugginsoft.com/content/…,我猜EXC_BAD_ACCESS 只能通过类UNIX 操作系统转换为SIGSEGVSIGBUS
  • 它正在工作! :) 非常感谢... :) 问题确实在于使用 gdb 运行应用程序,当我将它与 xcode 断开连接并单独在 iphone 上运行它时,它正确捕获了 EXC_BAD_ACCESS 信号。另一个问题是 1 EXC_BAD_ACCES 生成 aprox。 30 个信号都是一样的,所以我必须把它减少到只有 1 个。但这没关系。所以再一次...谢谢你的时间,你真的帮了我很多:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2014-01-22
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多