Ios 如何查找EXC\u BAD\u访问异常的地址?

Ios 如何查找EXC\u BAD\u访问异常的地址?,ios,cpu-registers,virtual-memory,mach,Ios,Cpu Registers,Virtual Memory,Mach,在中,我找到了如何从EXC_BAD_ACCESS恢复的方法,但我将访问不好的指针存储在全局数据库中。显然,这不会扩展。当我在iOS模拟器(i386)中运行代码时,我可以在我的catch\u Exception\u raise函数中看到调试器的Exception State Registers部分中的faultvaddr寄存器。但是,它的值与从vm\u allocate返回的指针不同或接近。有没有办法动态获取此值 鉴于下面的catch\u exception\u raise函数,我如何发现导致EX

在中,我找到了如何从
EXC_BAD_ACCESS
恢复的方法,但我将访问不好的指针存储在全局数据库中。显然,这不会扩展。当我在iOS模拟器(i386)中运行代码时,我可以在我的
catch\u Exception\u raise
函数中看到调试器的
Exception State Registers
部分中的
faultvaddr
寄存器。但是,它的值与从
vm\u allocate
返回的指针不同或接近。有没有办法动态获取此值

鉴于下面的
catch\u exception\u raise
函数,我如何发现导致
EXC\u BAD\u访问的地址

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

OSX和iOS内部书籍()中有大量关于这方面的详细信息。本书中的清单11-21(同上)实际上显示了这样做的示例代码。简而言之,您有两种选择:

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

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)工作,但下面的工作()对于B)在32位iOS模拟器上工作。我不确定
\uu faultvaddr
对应的arm寄存器是什么,所以您必须在尝试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);

谢谢今晚我来试试。我不知道你说的
&exc.old_state
是什么意思
exception\u type\u t
只是一个
int
exception\u data\u t
只是一个
int*
。您需要获取异常结构。您可以通过从异常端口读取mach_msg来获得该消息。代码(在同一个清单中)演示了这一点。对不起,你在说什么清单?从哪里来的?对不起,我刚开始在业余时间做这项工作,而且资料很少。