iOS信号处理程序被SIGSEGV卡住

问题描述

我想记录崩溃(我要记录SIGSEGV崩溃),并在iOS下次启动时向服务器报告。

我引用了这篇文章Handling unhandled exceptions and signals

我这样做:

  1. 启动后。
void mysighandler(int signalCode)
{
   // record the crash...
}

signal(SIGSEGV,mysighandler);
  1. 使用以下代码触发崩溃:
__unsafe_unretained NSObject *aaa;
@autoreleasepool {
    NSObject *obj = [[NSObject alloc] init];
    aaa = obj;
}
[aaa respondsToSelector:@selector(init)];

它确实遇到了mysighandler。但是崩溃发生后卡住了(单击主屏幕上的“应用”图标,无需进行Xcode调试。)。

我可以避免此代码mysighandler中卡住。

void mysighandler(int signalCode)
{
   // record the crash...
   signal(SIGSEGV,SIG_DFL);
}

void mysighandler(int signalCode)
{
   // record the crash...
   abort();
}

我的问题是处理SIGSEGV崩溃(信号)的正确方法是什么?

这是完整的演示代码。可以复制到AppDelegate并尝试一下。

@interface AppDelegate ()
@end

@implementation AppDelegate

void mysighandler(int signalCode)
{
//    // This code can avoid the stuck issue.
//    signal(SIGSEGV,SIG_DFL);
//
//    // This code can also avoid the stuck issue.
//    abort();
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // handle the SIGSEGV signal.
    signal(SIGSEGV,mysighandler);
    
    // trigger the SIGSEGV crash
    __unsafe_unretained NSObject *aaa;
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
        aaa = obj;
    }
    [aaa respondsToSelector:@selector(init)];
    return YES;
}

@end

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)