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 :(得分:4)
近似,您无法在信号处理程序中执行任何操作。问题是由信号中断的代码可能是持有锁。如果你的处理程序试图采用相同的锁,那么它会死锁。
sigaction
手册页列出了官方批准在信号处理程序中使用的函数。清单很简短。 <{1}}和Objective-C方法调度都不在该列表中。
但是,如果NSLog()
没有死锁,那么它应该像往常一样打印输出。您的崩溃可能是NSLog()
而不是SIGBUS
。也许编译器优化器正在转换您的SIGSEGV
,以便它以不同的方式崩溃。也许TestFlight会安装自己的信号处理程序来替换你的信号处理程序。