Регистрация сбоев во время выполнения в моно на OS X

Я хотел бы знать обо всех сбоях моего приложения «в дикой природе». Мы можем легко перехватывать управляемые исключения, используя AppDomain.CurrentDomain.UnhandledException.

Время от времени мы получаем сбои в неуправляемом коде (либо из-за нашего собственного взаимодействия с собственными библиотеками, либо иногда из-за неправильного использования monomac или проблем с самим monomac). Я хотел бы знать, когда они происходят, а также.

Я связал структуру plcrashreporter и добавил ее в свое приложение. Я прочитал обсуждение использования отчетов о сбоях с Xamarin.iOS приложениями и реализовал < href="https://stackoverflow.com/questions/14499334/how-to-prevent-ios-crash-reporters-from-crashing-monotouch-apps/">обходной путь.

Пока все хорошо — я могу использовать отчет о сбоях, и мое приложение работает нормально. Тем не менее, я, кажется, ограничен в том, какие сигналы на самом деле ловятся.

Например, SIGILL и SIGABRT оба попадают в ловушку репортера о сбое. Отчет о сбое записывается на диск и может быть прочитан при следующем запуске приложения.

Однако SIGSEGV и SIGBUS не попадаются. Вместо этого я получаю трассировку стека, записанную в консоль вместе с:

=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

Так что похоже, что ситуация на Mac не совсем такая, как на iOS. Обходной путь позволяет запускать отчет о сбоях, но Mono, похоже, не вызывает SIGABRT, когда получает SIGSEGV из неуправляемого кода.

Есть идеи?


person TheNextman    schedule 17.10.2013    source источник


Ответы (1)


Обходной путь для удаления и переназначения обработчиков SIGSEGV и SIGBUS требуется только для запуска приложения с подключенным отладчиком.

Поскольку нас интересуют только текущие ошибки, мы можем окружить код, чтобы включить PLCrashReporter, с помощью #IF DEBUG.

person TheNextman    schedule 22.10.2013