2014-06-05 45 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安装自己的信号处理程序来替换你的信号处理程序。

相关问题