Crashlytics和自定义NSUncaughtExceptionHandler

时间:2015-09-01 11:25:55

标签: ios objective-c

我需要在静态库中实现崩溃报告,我将其发送到其他应用程序。为此,我将自己注册为NSUncaughtExceptionHandler

NSSetUncaughtExceptionHandler(HsWatchdogUncaughtExceptionHandler);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);

在此之前,我还使用NSGetUncaughtExceptionHandler()

继续引用之前的UncaughtExceptionHandler

由于很多使用我的库的应用程序也有自己的崩溃报告机制(通常是Crashlytics),我需要我的lib才能很好地进行游戏。

我打算做的是,在使用NSException调用exceptionHandler之后,我想将它传递给'之前的UncaughtExceptionHandler'。

这会起作用吗?

self.previousUncaughtExceptionHandler(exception);

2 个答案:

答案 0 :(得分:8)

声明一个变量来存储前一个处理程序

static NSUncaughtExceptionHandler *_previousHandler;

首先获取前一个处理程序并将其存储在全局:

_previousHandler = NSGetUncaughtExceptionHandler();

然后创建自己的处理程序:

void onException(NSException * exception) {
    // do what you want to do ... then call the previous handler
    _previousHandler(exception);
}

将其设置为未捕获的异常处理程序:

 NSSetUncaughtExceptionHandler(&onException)

答案 1 :(得分:1)

看到这个并且已经有几年了,但是我不确定实现自己的异常处理程序是支持的还是可行的。这真的取决于第三方图书馆如何实施他们的支持。但是两个较大的第三方库(HockeyApp和Crashlytics)建议不要与它们的库一起实现你自己的异常处理程序。 https://support.hockeyapp.net/discussions/problems/34639-exception-reason-text-is-missing-in-crash-reports

https://support.hockeyapp.net/discussions/problems/11409-hockeyapp-does-not-generate-crash-report " 2。实现了一个捕获异常的uncaughtExceptionHandler,请验证代码中不存在这样的方法。"

Is it safe to use NSSetUncaughtExceptionHandler with Fabric? “在iOS上有两个UncaughtExceptionHandlers是不受支持的,不推荐使用。” “你应该只在iOS上使用一个未被捕获的异常处理程序,我个人不推荐你正在讨论的方法”

Realm团队讨论了如何将NSSetUncaughtExceptionHandler与第三方库结合使用的句柄,因此如果您决定这样做,您可能会看看它们是如何实现它的。 https://github.com/realm/realm-cocoa/issues/3822