2014-06-05 70 views
3
struct sigaction newSignalAction; 
memset(&newSignalAction, 0, sizeof(newSignalAction)); 
newSignalAction.sa_handler = &SignalHandler; 
sigaction(SIGSEGV, &newSignalAction, NULL); 

[TestFlight takeOff:@"etc etc etc"]; 

然後我可以在信號處理程序中做什麼?

void SignalHandler(int sig) { 
    NSLog(@"Boom"); 
} 

我試圖執行SIGSEGV信號:

int *p = NULL; 
*p = 1; 

但我的處理程序沒有被調用。相反,Xcode指出行*p = 1

我讀過,你不能用信號處理程序打印東西。也許這就是問題所在。什麼可以我呢?我聽說你應該保存數據 - 所以我想我可以在Documents目錄中創建文件。我也試圖做到這一點,但文件也沒有創建。

+0

您是否嘗試過在信號處理程序中設置斷點,以查看它是否正在執行?如果沒有,你得到的信號可能不是'SIGSEGV'。 – nneonneo

+0

我用你的代碼(沒有'TestFlight'東西),我得到了'Boom'。我所做的是,我沒有在XCode中運行它,而是從終端運行它。 – 3329

回答

3

近似地,你不能在信號處理程序中做任何事情。問題在於被信號中斷的代碼可能持有鎖。如果您的處理程序嘗試使用相同的鎖,那麼它會死鎖。

sigaction手冊頁列出了官方批准用於信號處理程序的功能。該清單很短。 NSLog()和Objective-C方法調度都不在該列表中。

但是,如果NSLog()沒有死鎖,那麼它應該照常打印輸出。也許你的崩潰是SIGBUS而不是SIGSEGV。也許編譯器優化器正在改變你的*NULL=1,以便以不同的方式崩潰。也許TestFlight安裝自己的信號處理程序來替換你的信號處理程序。

相關問題