我可以在信号处理程序中做什么?

时间:2014-06-05 04:53:28

标签: ios objective-c

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目录中创建文件。我也尝试这样做,但也没有创建文件。

1 个答案:

答案 0 :(得分:4)

近似,您无法在信号处理程序中执行任何操作。问题是由信号中断的代码可能是持有锁。如果你的处理程序试图采用相同的锁,那么它会死锁。

sigaction手册页列出了官方批准在信号处理程序中使用的函数。清单很简短。 <{1}}和Objective-C方法调度都不在该列表中。

但是,如果NSLog()没有死锁,那么它应该像往常一样打印输出。您的崩溃可能是NSLog()而不是SIGBUS。也许编译器优化器正在转换您的SIGSEGV,以便它以不同的方式崩溃。也许TestFlight会安装自己的信号处理程序来替换你的信号处理程序。