ios - SocketRocket RunLoop 偶发性崩溃

标签 ios objective-c exc-bad-access nsrunloop socketrocket

所以我们的应用程序在 SocketRocket 中已经经历了一段时间的崩溃。我们每天从中得到大约 20 次崩溃,堆栈跟踪如下:

Crashed: com.apple.root.default-overcommit-priority
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000c 

Thread : Crashed: com.apple.root.default-overcommit-priority
0  libsystem_platform.dylib       0x3b8ff816 spin_lock$VARIANT$mp + 1
1  CoreFoundation                 0x30e2d593 CFSocketEnableCallBacks + 54
2  CFNetwork                      0x30a926f9 SocketStream::securityBufferedRead_NoLock() + 212
3  CFNetwork                      0x30a925f5 SocketStream::socketCallbackReadLocked(SocketStreamSignalHolder*) + 76
4  CFNetwork                      0x30a90d8f SocketStream::socketCallback(__CFSocket*, unsigned long, __CFData const*, void const*) + 102
5  CFNetwork                      0x30a90cf3 SocketStream::_SocketCallBack_stream(__CFSocket*, unsigned long, __CFData const*, void const*, void*) + 58
6  CoreFoundation                 0x30e6a337 __CFSocketPerformV0 + 578
7  CoreFoundation                 0x30e68183 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14
8  CoreFoundation                 0x30e67653 __CFRunLoopDoSources0 + 206
9  CoreFoundation                 0x30e65e47 __CFRunLoopRun + 622
10 CoreFoundation                 0x30dd0c27 CFRunLoopRunSpecific + 522
11 CoreFoundation                 0x30dd0a0b CFRunLoopRunInMode + 106
12 Foundation                     0x317be3db -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 254
13 Piazza                         0x00110b7b -[_SRRunLoopThread main]
14 Foundation                     0x31880c87 __NSThread__main__ + 1062
15 libsystem_pthread.dylib        0x3b904c1d _pthread_body + 140
16 libsystem_pthread.dylib        0x3b904b8f _pthread_start + 102

20 多个小时以来,我一直在努力确定它。它非常零星 - 我重现它的最好方法是注销,所以连接都失败了,然后尝试激发一些连接,和/或等待几分钟。几分钟后,大约有 1/4 的时间工作。但是,有一些人在登录时遇到此崩溃的日志。

就代码而言,我不知道是什么导致了 EXC_BAD_ACCESS,因为 13 以上的所有条目都没有可用的源代码,而且查看汇编代码并没有真正启发我 - 我所发现的一切是 ecx 在事情的过程中被设置为 0xc,然后 spin_lock$VARIANT$mp 尝试将一些寄存器交换为位于 ($ecx) 的东西,然后它崩溃了。 [_SRRunLoopThread main],我有源代码的堆栈跟踪的唯一部分如下:

- (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]]) {
        }
        assert(NO);
    }
}

它在 while 行崩溃。我怀疑某个地方的某些东西在它应该被释放之前就被释放了,但我不确定它是 SRWebSocket 还是以某种方式添加到运行循环中的 block 或什么。我对运行循环不是很熟悉。

为了解决这个问题,我已经没有什么富有成效的事情可做了,而且我几乎没有取得任何进展。感谢您的帮助。

最佳答案

我遇到了类似的问题。这可能是因为对象在回调发生之前被释放了。

所以在 dealloc 方法中关闭流可能是个好主意。

关于ios - SocketRocket RunLoop 偶发性崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245057/

相关文章:

ios - xcode 中抛出的 EXC_BAD_ACCESS 错误

iphone - EXC_BAD_ACCESS 在不同 View 中添加和删除 View 时

ios - PFQueryTableViewController "loading"指标查询成功后卡住

objective-c - 自动释放溺水

ios - 高效处理多次/频繁调用 UIView needsDisplayInRect

ios - 如何在 iOS 中从服务器接收二进制文件列表

objective-c - 使用分布式对象的进程之间的通信

ios - 核心数据 EXC_BAD_ACCESS KERN_PROTECTION_FAILURE

ios - 有没有办法一次更新多个子值?

ios - 来自 Web 服务的数据查找未在标签中正确显示