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

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

最佳答案

近似地,您不能在信号处理程序中执行任何操作。问题是被信号中断的代码可能持有锁。如果您的处理程序试图获取相同的锁,那么它就会死锁。

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

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

关于ios - 我可以在信号处理程序中做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24051879/

相关文章:

javascript - 移动 Safari 上 JavaScript websocket 中的明显阻塞行为

iphone - UIWebView 根据所选主题更改 css 文件

ios - 加载自定义 UIView

objective-c - 使用字符串而不是对象调用工厂方法

ios - iOS 中的动画幻灯片

ios - Parse SDK 不需要调用dispatch_get_main_queue(),对吧?

iphone - iOS 崩溃报告没有得到正确的行号

ios - 不使用自动布局时,可以以编程方式使用 iOS 中的大小类/特征集合吗

android - React Native ScrollView 与成长中的 child

iphone - 为什么我的 UIButton 没有显示?