Как отлаживать iOS EXC_BAD_ACCESS KERN_INVALID_ADDRESS на iOS

Я получаю ошибки iOS EXC_BAD_ACCESS при использовании SocketRocket, и мне интересно, что я могу сделать для дальнейшей отладки проблемы, чтобы определить, является ли проблема на моей стороне или на стороне SocketRocket.

Трассировка стека, которую я получаю:

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x2000000c
raw
0    libobjc.A.dylib     objc_msgSend + 5
1    OMlearnings         SRWebSocket.m line 692    __30-[SRWebSocket _failWithError:]_block_invoke_2
2    libdispatch.dylib   _dispatch_call_block_and_release + 10
10   UIKit               UIApplicationMain + 1136
11   OMlearnings         main.m line 16    main

или иногда

Crashed: NSOperationQueue Serial Queue
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0xc
raw
0    libobjc.A.dylib     objc_msgSend + 5
1    OMlearnings         SRWebSocket.m line 613    -[SRWebSocket scheduleInRunLoop:forMode:]
2    OMlearnings         SRWebSocket.m line 600    -[SRWebSocket _connect]
3    OMlearnings         OMSRealTimeTeamDashboard.m line 157    -[OMSRealTimeTeamDashboard sendMessage:]
4    OMlearnings         OMSRealTimeTeamDashboard.m line 171    -[OMSRealTimeTeamDashboard eventReceived:]
5    CoreFoundation      __invoking___ + 68
6    CoreFoundation      -[NSInvocation invoke] + 282
7    Foundation          -[NSInvocationOperation main] + 112
8    Foundation          -[__NSOperationInternal _start:] + 770
14   libsystem_pthread.dylib _pthread_wqthread + 298

Моя кодовая база довольно проста и в основном подписывается на события и выполняет sendMessage для socketrocket в очереди (для борьбы с параллелизмом)

[signalServices subscribe:my-event toBlock:^(NSNotification * notification) {
    [this.queue addOperation:[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(eventReceived:) object:notification]];
}];

- (void)eventReceived: (NSNotification *)notification {
    // ...
    [socket send:[NSString stringWithFormat:@"%i,1,%@", currentUserId.intValue, [NSNumber numberWithInt: rate.value]]];
}

Я читал людей, использующих NSZombies для отладки проблемы, но моя проблема встречается редко, поэтому мне, скорее всего, не хватит памяти, прежде чем проблема станет видимой. Работает нормально 99% времени.

Есть ли что-нибудь, что нужно знать об iOS, которая могла бы случайным образом вызывать сбой в приложениях, использующих сокеты и т. Д.? Например, у нас включена фоновая выборка, это может быть причиной некоторых случайных сбоев?

Спасибо!

1 ответ

В трассировке стека,

0    libobjc.A.dylib     objc_msgSend + 5
1    OMlearnings         SRWebSocket.m line 692    __30-[SRWebSocket _failWithError:]_block_invoke_2

EXC_BAD_ACCESS произошла в этой строке, https://github.com/square/SocketRocket/blob/master/SocketRocket/SRWebSocket.m#L692

[self.delegate webSocket:self didFailWithError:error];

Согласно документу, https://github.com/square/SocketRocket

SRWebSocket
(unlike NSURLConnection, SRWebSocket won't retain the delegate)

@property (nonatomic, assign) id <SRWebSocketDelegate> delegate;

свойство делегата не было сохранено объектом SRWebSocket, поэтому, если вы не сохраните объект делегата, оно будет зависать с висящим указателем. Как вы имеете сильную ссылку на объект делегата?

Другие вопросы по тегам