Erh*_*nis 6 debugging xcode objective-c ios xcode5
因此,在许多不同的项目中已经发生过多次这种情况.当Xcode出现错误时,我将在Xcode中调试我的应用程序.看了之后,我点击了Step Over或Continue ......它什么也没做.更确切地说,它的行为就像它踩到了,但实际上并没有去任何地方.据我所知,这可以无限期重复.这有问题的一个原因是它永远不会给我崩溃日志,因为它永远不会崩溃.我只在应用程序崩溃并且没有被调试时获得崩溃日志(这意味着我必须通过Crittercism或检查设备日志).
以前有人看过这个,并且/或者知道它为什么会这样做?我在其他地方没有看到任何提及,但在几个项目中我发生了这件事.
例如,在一个项目中,我们使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
它在线上崩溃了while.(顺便说一下,我添加了NSLog系列).当我点击"继续"或"跳过"时,线条指示灯会短暂闪烁,然后再次出现在同一条线上.请注意,它不会继续到NSLog行,也没有任何内容写入控制台.我目前仍然试图让它再次崩溃(这种特殊的崩溃是相当不可预测的),但如果我没记错的话,行指示器说EXC_BAD_ACCESS,可能是一个过早释放的对象.
ObjC 超出范围错误将导致抛出 ObjC 异常,如果未捕获,则会中止。中止实际上只会引发 BSD 信号 (SIGKILL)。这对于调试器来说很容易传递给进程,因此它可以自然地终止。
EXC_BAD_ACCESS 和 EXC_BAD_INSTRUCTION 是有趣的例外,因为它们首先出现在操作系统的 Mach 端。为了正确传播,如果有处理程序,则应将它们本地处理为 Mach 异常;如果没有,则应将它们传递给某个系统处理程序,将它们转换为等效的 BSD 异常 (SIGSEGV),然后将其传递给BSD 信号处理程序,最终将导致您的程序退出。
提供给调试器的内核接口中存在一个长期存在的错误,使得调试器无法从外部正确地实现这个小舞蹈。因此,如果您收到 EXC_BAD_ACCESS,那么您几乎就陷入困境了。在大多数情况下,这并不重要,你的程序无论如何都会掉头死亡。通过观察它这样做,你不会真正了解你的崩溃。
仅当您已安装并想要调试 SIGSEGV 处理程序时才重要。十多年来,这在 MacOS X 上一直很困难。幸运的是,实际上只有极少数人需要这样做......
| 归档时间: |
|
| 查看次数: |
1326 次 |
| 最近记录: |