繁体   English   中英

SocketRocket RunLoop零星崩溃

[英]SocketRocket RunLoop sporadic crash

所以我们的应用程序在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或某种程度上被添加到运行循环中的块或者是什么。 我对运行循环并不完全熟悉。

为了解决这个问题,我已经没有多少工作要做了,而且我几乎没有取得任何进展。 任何帮助表示赞赏。

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

因此,在dealloc方法中关闭流可能是个好主意。

我在MixPanel中看到了同样的问题,它看起来基于该源。 假设我正确理解了ABI,传递给CFSocketEnableCallbacks的CFSocketRef值为NULL,因此启用它以进行读回调(1)失败。 我不能告诉你为什么 CFSocketEnableCallbacks被一个NULL套接字调用,但这就是它看起来正在发生的事情。 也许这是一个零弱的参考问题。 当我知道更多时,我会更新这个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM