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

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目录中创build文件。 我也试图做到这一点,但文件也没有创build。

近似地,你不能在信号处理器中做任何事情。 问题是由信号中断的代码可能会持有锁。 如果您的处理程序试图采取相同的锁,然后死锁。

sigaction手册页列出了官方批准用于信号处理程序的function。 名单很短。 NSLog()和Objective-C方法调度都不在该列表中。

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