所以我们的应用程序在 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
或以某种方式添加到运行循环的块或什么。我对运行循环并不完全熟悉。
我已经没有什么可以做的事情来解决这个问题了,而且我几乎没有取得任何进展。任何帮助表示赞赏。