2013-10-18 1 views
1

В How do I recover from EXC_BAD_ACCESS? я выяснил, как восстановить из EXC_BAD_ACCESS, но у меня был плохо доступный указатель, хранящийся в глобальном. Очевидно, что это не будет масштабироваться. Когда я запускаю код в iOS Simulator (i386), я могу увидеть регистр faultvaddr в разделе Exception State Registers отладчика, когда внутри моей функции catch_exception_raise. Однако его значение не совпадает или близко к указателю, возвращаемому с vm_allocate. Есть ли способ получить это значение динамически?Как найти адрес исключения EXC_BAD_ACCESS?

С учетом функции 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; 
} 

ответ

2

Существует большое количество деталей на том, что в OS X и IOS Internals книги (http://www.newosxbook.com). В листинге 11-21 (ibid) в книге на самом деле показан пример кода для этого. В общем, у Вас есть два варианта:

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

или

Б) называют thread_get_state к порту потока (так как у вас есть, что прямо там, как аргумент # 2), и получить ПК (указатель команд) или любой из других регистров

EDIT

Я не уверен, как сделать работу A), но следующие работы (found here) для B) на 32-битном iOS-симуляторе. Я не уверен, что эквивалент регистра рычага для __faultvaddr, поэтому вам придется разобраться в этом, прежде чем пытаться вооружаться.

// 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); 
+0

Спасибо! Я попробую сегодня вечером. –

+0

Я не уверен, что вы подразумеваете под '& exc.old_state'. 'exception_type_t' - это просто' int', а 'exception_data_t' - это просто' int * '. –

+0

Вам нужно получить структуру исключений. Вы можете получить это, прочитав mach_msg из порта исключения. Код (в том же листинге) демонстрирует это. – Technologeeks

Смежные вопросы