问题描述
我想记录崩溃(我要记录SIGSEGV崩溃),并在iOS下次启动时向服务器报告。
我引用了这篇文章Handling unhandled exceptions and signals。
我这样做:
- 启动后。
void mysighandler(int signalCode)
{
// record the crash...
}
signal(SIGSEGV,mysighandler);
- 使用以下代码触发崩溃:
__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 (将#修改为@)