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 目录中创建文件。我也尝试这样做,但也没有创建文件。
最佳答案
近似地,您不能在信号处理程序中执行任何操作。问题是被信号中断的代码可能持有锁。如果您的处理程序试图获取相同的锁,那么它就会死锁。
sigaction
手册页列出了正式批准用于信号处理程序的函数。 list 很短。 NSLog()
和 Objective-C 方法调度都不在该列表中。
但是,如果 NSLog()
没有死锁,那么它应该像往常一样打印输出。也许您的崩溃是 SIGBUS
而不是 SIGSEGV
。也许编译器优化器正在转换您的 *NULL=1
以使其以不同的方式崩溃。也许 TestFlight 安装了自己的信号处理程序来替换您的信号处理程序。
关于ios - 我可以在信号处理程序中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24051879/