Как вы реализуете глобальную обработку исключений iPhone?

У меня есть один сбой в приложении для iPhone, который вызывает NSException. Отчеты о сбоях совершенно неоднозначны, когда ошибка и что именно вызывает ее. Есть ли у меня разумный способ установить обработчик исключения верхнего уровня где-нибудь, чтобы узнать, что его вызывает? Я не могу воспроизвести проблему самостоятельно, но некоторые из моих бета-пользователей, безусловно, могут.

Какой умный способ справиться с проблемой такого рода?

Если вы планируете делать это самостоятельно, вы можете использовать один из этих подходов

Approach1:

 void onUncaughtException(NSException* exception) { //save exception details } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSSetUncaughtExceptionHandler(&onUncaughtException); //Add coding to find if any exception has occurred from saved details if so send it to server or ask user to comment on the issue. //Rest of the coding } 

Approach2:

 void onUncaughtException(NSException* exception) { //Save exception details } int main(int argc, char *argv[]) { @autoreleasepool { NSSetUncaughtExceptionHandler(&onUncaughtException); return UIApplicationMain(argc, argv, nil, NSStringFromClass([SGGI_AppDelegate class])); } } -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Add coding to find if any exception has occurred from saved details if so send it to server or ask user to comment on the issue. //Rest of the coding } 

Approcach3:

 int main(int argc, char *argv[]) { @autoreleasepool { @try { return UIApplicationMain(argc, argv, nil, NSStringFromClass([SGGI_AppDelegate class])); } @catch (NSException *exception) { //Save the exception } @finally { } } } -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Add coding to find if any exception has occurred from saved details if so send it to server or ask user to comment on the issue. //Rest of the coding } 

Заметка:

  • В моей перспективе не пытайтесь отправить данные об исключениях на сервер во время сбоя, отправьте его, когда он снова запустит приложение.

  • Если вы собираетесь использовать NSUserDefaults для сохранения сведений об исключении, вам необходимо синхронизировать их во время сбоя, иначе он не будет сохраняться.

Следующий fragment кода выполняет задание.

  - (void)applicationWillTerminate:(UIApplication *)application { [[NSUserDefaults standardUserDefaults]synchronize]; } 
  • Если вы предпочитаете сохранять его на sqlite db, тогда он не нуждается в том, чтобы называть что-либо, чтобы сохраняться в момент сбоя

В XCode вы всегда должны устанавливать глобальную objc_exception_throw останова для objc_exception_throw . Затем вы (обычно) получаете гораздо более значимую трассировку стека относительно того, что на самом деле пытается выбросить исключение.

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

Вы пробовали NSSetUncaughtExceptionHandler ?

Другим вариантом отслеживания отчетов о сбоях является правдоподобный CrashReporter , открытый исходный код, который автоматически отправляет вам отчеты о сбоях из поля.

Существует также CrashReporterDemo , еще один вариант с открытым исходным кодом, который представляет собой комбинацию правдоподобного CrashReporter и некоторого кода сервера для лучшего отслеживания отчетов о сбоях.

И, наконец, есть MacDevCrashReporter , служба, которая, похоже, имеет сходство с iOSExceptional.com, в другом ответе. Я понятия не имею, каковы условия их обслуживания, поскольку я не подписался на бета-версию. Определенно стоит проверить, прежде чем проникать слишком глубоко.

Проверьте Критерий . Это выше и выше того, о чем вы просите здесь, что позволяет вам получать эту информацию для всех пользователей, использующих ваше приложение, чтобы вы могли увидеть свой собственный сбой.

Вы также можете загрузить DYSM для своей конкретной сборки, и она автоматически символизирует крах для вас на своем веб-сайте. Это должно предоставить вам самую четкую трассировку стека без подключения к отладчику.

Вы также можете захотеть убедиться, что вы настроены на перерыв в исключениях Objetive-C. В Xcode 4 на вкладке точек останова вы можете добавить исключение Breakpoint Exception, которое разбивается на оба варианта C ++ и Obj-C. Без этого большинство трассировок стека за выброшенные исключения довольно бесполезны.

Удачи!

  • Проверьте, запущено ли приложение из Visual Studio
  • Как я могу подключиться к Android с ADB через TCP?
  • Где читать консольные сообщения из background.js в расширении Chrome?
  • Индексы индексов должны быть либо натуральными натуральными, либо логическими, общим решением
  • Ошибка: не удается получить доступ к файловому ящику / Debug / ..., потому что он используется другим процессом
  • Общие рекомендации по отладке в R
  • Невозможно установить точку останова Java в Intellij IDEA
  • Как я могу отлаживать приложения в Java Web Start (JNLP)?
  • Где появляется сообщение System.Diagnostics.Debug.Write?
  • Как обнаружить системную информацию типа os или типа устройства
  • Как отлаживать скрипт перезаписи htaccess
  • Interesting Posts

    Маршрутизатор, который может изменять TTL

    Минимальный минимум, необходимый для написания примера приложения MSMQ

    Я не могу открывать / пинговать любые антивирусные сайты

    IllegalStateException: невозможно изменить идентификатор контейнера fragmentа

    Как увеличить максимальное количество USB-устройств, которые можно подключить одновременно в Windows 7?

    Чтение / запись в реестр Windows с помощью Java

    Удалите файлы, рекурсивно соответствующие имени в командной строке (OS X)

    Entity Framework 4 CTP 4 / CTP 5 Общий шаблон хранилища и единица тестирования

    Как загрузить общий объект в C ++?

    Масштабирование DPI в Windows 8.1 с помощью командной строки

    Случайное число c ++ в некотором диапазоне

    Необходимость скобок в макросах в C

    Предотrotation наследования classов в C ++

    Почему нельзя использовать ViewPager внутри fragmentа? Это на самом деле

    Предпочтительный способ Java для отправки URL-адреса HTTP для доступности

    Давайте будем гением компьютера.