2013-12-18 22 views
5

SocketRocketを使用しているときにiOS EXC_BAD_ACCESSエラーが発生しました。問題が私の側にあるのか、SocketRocket側にあるのかを判断するために、iOS上でiOS EXC_BAD_ACCESS KERN_INVALID_ADDRESSをデバッグする方法

私が手にスタックトレースは次のとおりです。

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 

私のコードベースは非常にシンプルで、基本的にイベントをサブスクライブし、キューにsocketrocketのsendMessageを実行する(同時性に対処するため)

[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を使用している人を読んだことがありますが、 yの問題はほとんど起こりません。問題が発生する前にメモリが不足する可能性があります。 99%の時間で正常に動作します。

ソケットなどを使用するアプリをランダムにクラッシュさせるiOSについて知っておくべきことはありますか?たとえば、バックグラウンドフェッチを有効にしていると、ランダムクラッシュの原因になる可能性がありますか?

ありがとうございます!スタックトレースで

+0

これを解決しましたか? – Spail

+0

そのアップデートはありますか? – franck

答えて

4

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

EXC_BAD_ACCESSは、デリゲートプロパティがで保持されなかった

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

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

、文書によると、この行にhttps://github.com/square/SocketRocket

https://github.com/square/SocketRocket/blob/master/SocketRocket/SRWebSocket.m#L692

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

を発生SRWebSocketオブジェクト、したがって、あなたがthを保持しない場合オブジェクトをデリゲートすると、ぶら下がったポインタでクラッシュします。どのように委譲オブジェクトの強力な参照を持っていますか?

+1

私がデリゲートとして渡すオブジェクトは、injective_register_singletonを使用してインスタンス化されているため、参照が消滅することはほとんどありません –

+1

あなたの質問にあなたのコードを貼り付けてみませんか? –

関連する問題