2015-11-02 94 views
3

我的应用程序包括崩溃报告库,使用NSSetUncaughtExceptionHandler为了赶上崩溃。 我需要在崩溃报告实施之前的\之前实现自定义操作(日志崩溃和显示警报视图)。 为了实现这种行为,首先我使用NSGetUncaughtExceptionHandler()保留对先前UncaughtExceptionHandler的引用,并注册我的自定义异常处理程序和信号处理程序。在我的自定义处理程序中,我试图在自定义操作之前执行之前的处理程序,但是这会为previousHandler(异常)(两种情况)引发一个SIGABRT信号。 下面是代码示例:自定义NSUncaughtExceptionHandler调用以前的异常处理程序

static NSUncaughtExceptionHandler *previousHandler; 

void InstallUncaughtExceptionHandler() 
{ 
    // keep reference to previous handler 
    previousHandler = NSGetUncaughtExceptionHandler(); 

    // register my custom exception handler 
    NSSetUncaughtExceptionHandler(&HandleException); 
    signal(SIGABRT, SignalHandler); 
    signal(SIGILL, SignalHandler); 
    signal(SIGSEGV, SignalHandler); 
    signal(SIGFPE, SignalHandler); 
    signal(SIGBUS, SignalHandler); 
    signal(SIGPIPE, SignalHandler); 
} 

void HandleException(NSException *exception) 
{ 
    // execute previous handler 
    previousHandler(exception); 
    // my custom actions 
} 

void SignalHandler(int signal) 
{ 
    NSLog(@"SignalHandler"); 
} 
  1. 我如何可以执行以前的处理程序没有抛出一个信号?
  2. 任何想法为什么SignalHandler不会在系统发出信号时调用?

回答

3

不要注册信号处理程序。我混淆了一下下面的代码提交,但它从生产应用程序,在App Store的:

AppDelegate中的application:didFinishLaunchingWithOptions:

fabricHandler = NSGetUncaughtExceptionHandler(); 
NSSetUncaughtExceptionHandler(&customUncaughtExceptionHandler); 

处理程序:

void customUncaughtExceptionHandler(NSException *exception) { 
    // Custom handling 

    if (fabricHandler) { 
     fabricHandler(exception); 
    } 
} 
+1

我还添加了'if'语句,但它仍然崩溃。你认为信号处理程序导致问题? –

+0

尝试没有他们。它们不是必需的,因为默认处理程序调用任何'NSGetUncaughtExceptionHandler()'返回的值。您可能正在创建某种循环,但我不确定。 – Avi

0

PreviousSignalHandler可能会 1)重置所有设置的信号处理程序 2)呼叫中止

它会中止的原因之一。 所以你可以做所有你想做的事情,并调用以前的处理程序。

HTH