Регистрация сбоев во время выполнения в моно на OS X
Я хотел бы знать о любых сбоях моего приложения "в дикой природе". Мы можем легко захватить управляемые исключения, используя AppDomain.CurrentDomain.UnhandledException
,
Иногда мы получаем сбои в неуправляемом коде (либо из-за нашего собственного взаимодействия с нативными библиотеками, либо из-за неправильного использования monomac или проблем с самим monomac). Я также хотел бы знать, когда это произойдет.
Я связал инфраструктуру plcrashreporter и добавил ее в свое приложение. Я прочитал обсуждение использования аварийных репортеров с Xamarin.iOS
приложения и реализованные обходные пути.
Пока все хорошо - я могу использовать аварийный репортер, и мое приложение работает нормально. Тем не менее, я, кажется, ограничен в том, какие сигналы на самом деле поймали.
Например, 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 из неуправляемого кода.
Есть идеи?
1 ответ
Обходной путь для удаления и переназначения SIGSEGV
а также SIGBUS
обработчики требуются только для запуска приложения с подключенным отладчиком
Поскольку нас интересуют только живые ошибки, мы можем включить код, чтобы включить PLCrashReporter
с #IF DEBUG
,