1

如何从 EXC_BAD_ACCESS 中恢复?,我想出了如何从 中恢复EXC_BAD_ACCESS,但我将错误访问的指针存储在全局中。显然,这不会扩展。当我在 iOS 模拟器 (i386) 中运行代码时,我可以在我的函数内部看到调试器部分中的faultvaddr寄存器。但是,它的值与从. 有没有办法动态获取这个值?Exception State Registerscatch_exception_raisevm_allocate

鉴于catch_exception_raise下面的功能,我将如何发现导致的地址EXC_BAD_ACCESS

kern_return_t
catch_exception_raise(mach_port_t exception_port,
                      mach_port_t thread,
                      mach_port_t task,
                      exception_type_t exception,
                      exception_data_t code_vector,
                      mach_msg_type_number_t code_count)
{
    fprintf(stderr, "catch_exception_raise %d\n", exception);
    return KERN_SUCCESS;
}
4

1 回答 1

2

在 OS X 和 iOS 内部手册 ( http://www.newosxbook.com )中有大量详细信息。书中的示例 11-21(同上)实际上显示了这样做的示例代码。简而言之,您有两个选择:

A) 从异常数据中查看异常本身 - 将状态转换为 arm_thread_state,如下所示:

struct arm_thread_state *atsh = &exc.old_state;
printf ("CPSR is %p, PC is %p, etc.\n", atsh->cpsr, atsh->pc);

或者

B)调用thread_get_state到线程端口(因为你有那个作为参数#2),并获取pc(指令指针)或任何其他寄存器

编辑

我不知道如何使 A) 工作,但在 32 位 iOS 模拟器上,以下工作 (在此处找到) 用于 B)。我不确定 arm 寄存器的等价物是什么__faultvaddr,所以你必须在尝试 arm 之前弄清楚这一点。

// types from thread_status.h
x86_exception_state32_t x86_exception_state32; 
mach_msg_type_number_t sc = x86_EXCEPTION_STATE32_COUNT;

thread_get_state(thread,
                 x86_EXCEPTION_STATE32,
                 (thread_state_t)&x86_exception_state32,
                 &sc);
于 2013-10-18T12:22:42.447 回答