В 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;
}
Спасибо! Я попробую сегодня вечером. –
Я не уверен, что вы подразумеваете под '& exc.old_state'. 'exception_type_t' - это просто' int', а 'exception_data_t' - это просто' int * '. –
Вам нужно получить структуру исключений. Вы можете получить это, прочитав mach_msg из порта исключения. Код (в том же листинге) демонстрирует это. – Technologeeks