2015-11-02 89 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