以前有人看过这个,并且/或者知道它为什么会这样做?我在其他地方没有看到任何提及,但在几个项目中我发生了这件事.
例如,在一个项目中,我们使用SocketRocket,并且每隔一段时间(由于尚未知的原因)它在SRWebSocket.m中以下列方法崩溃:
- (voID)main;{ @autoreleasepool { _runLoop = [NSRunLoop currentRunLoop]; dispatch_group_leave(_waitGroup); NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate distantFuture] interval:0.0 target:nil selector:nil userInfo:nil repeats:NO]; [_runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; int i = 0; while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { NSLog(@"_runLoop %i %@",i++,[NSDate date]); } assert(NO); }}
它在while行崩溃了. (顺便说一下,我添加了NSLog系列).当我点击“继续”或“跳过”时,线条指示灯会短暂闪烁,然后再次出现在同一条线上.请注意,它不会继续到NSLog行,也没有任何内容写入控制台.我目前仍然试图让它再次崩溃(这种特殊的崩溃是相当不可预测的),但如果我没记错的话,行指示符说EXC_BAD_ACCESS,可能是一个过早释放的对象.
解决方法 一个ObjC超出范围错误将导致抛出一个ObjC异常,如果未被捕获则会在中止时抛出异常.中止实际上只会引发BSD信号(SIGKILL).调试器很容易传递给进程,因此它可以自然地死掉.EXC_BAD_ACCESS和EXC_BAD_INSTRUCTION是有趣的例外,因为它们首先进入OS的Mach端.为了正确传播,它们应该作为Mach异常本地处理,如果有一个处理程序,如果没有,它们应该传递给某个系统Handler,将它们转换为等效的BSD异常(SIGSEGV),然后传递给它BSD信号处理程序,最终将导致程序退出.
在调试器提供的内核接口中存在一个长期存在的错误,使得调试器无法从外部正确地实现这种小舞蹈.所以,如果你得到一个EXC_BAD_ACCESS,你就会陷入困境.在大多数情况下,这并不重要,你的程序只会转身并且无论如何都要死.通过观察它,你不会真正了解你的崩溃.
只有安装了SIGSEGV处理程序并希望调试它才有意义. MacOS X已经十年或更长时间了.幸运的是,实际上只有极少数人需要这样做……
总结以上是内存溢出为你收集整理的ios – Xcode不会跨越崩溃全部内容,希望文章能够帮你解决ios – Xcode不会跨越崩溃所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)