Я смог зарегистрировать свой собственный порт mach для захвата исключений mach в моих приложениях, и он прекрасно работает, когда я нацелен на 32 бит. Однако, когда я нацелен на 64-разрядный бит, вызывается мой обработчик исключений catch_exception_raise()
, но массив кодов исключений, передаваемых обработчику, имеет ширину 32 бит. Это ожидается в 32-битной сборке, но не в 64-битной версии.
В случае, когда я поймаю EXC_BAD_ACCESS
, первым кодом является номер ошибки, а второй код должен быть адресом ошибки. Поскольку второй код имеет ширину в 32 бита, высокие 32 бита адреса 64-разрядной ошибки усекаются.
Я нашел флаг в <mach/exception_types.h>
, который можно передать в task_set_exception_ports()
под названием MACH_EXCEPTION_CODES
, который, глядя на источники Дарвина, управляет размером кодов, переданных обработчику. Похоже, что оно предназначено для использования с поведением, переданным в task_set_exception_ports()
.
Однако когда я это делаю и запускаю исключение, мой mach-порт получает уведомление, я вызываю exc_server()
, но мой обработчик никогда не вызывается, а когда ответное сообщение отправляется обратно в ядро, я получаю поведение исключения по умолчанию.
Я нацелен на 10.6 SDK.
Я действительно хочу, чтобы яблоко лучше документировало это. У кого-нибудь есть идеи?