4

Snow Leopard サーバーで数日から数週間実行されるアプリケーションがあります。10秒間-[NSRunLoop runUntilDate:]「一時停止」し、タスクを実行してから再び一時停止します。1 時間以上実行した後、アプリがクラッシュし、次のレポートが表示されます。

クラッシュレポート

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000013
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
objc_msgSend() selector name: release

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x00007fff84cfef0c objc_msgSend + 40
1   com.apple.CoreFoundation        0x00007fff84e363d1 __CFRunLoopDoSources0 + 1361
2   com.apple.CoreFoundation        0x00007fff84e345c9 __CFRunLoopRun + 873
3   com.apple.CoreFoundation        0x00007fff84e33d8f CFRunLoopRunSpecific + 575
4   com.apple.Foundation            0x00007fff83e73b74 -[NSRunLoop(NSRunLoop)  runMode:beforeDate:] + 270
5   com.apple.Foundation            0x00007fff83ebf19a -[NSRunLoop(NSRunLoop) runUntilDate:] + 78

一見したところ、NSRunLoopオブジェクトが有効ではなくなっているため、releaseCF の奥深くにあるメッセージがクラッシュを引き起こしていると思いました。currentRunLoopただし、前の行でオブジェクトへの参照を取得しているため、そうではないと思います。

クラッシュ時間は 1 時間から 1.5 時間の間で変動しますが、何が原因なのかはわかりません。次に何をすべきかわからないので、コメントや意見、デバッグのアイデアをいただければ幸いです。

編集:問題解決 - 以下の私の答えを見てください

4

2 に答える 2

6

さらなるテストにより、私は自分の質問に答えることができました:

実行ループに問題はありません。自動解放プール内のオブジェクトを解放するのは実行ループであり、そのため、コードのどの部分の問題も実行ループに関連している可能性があります。

私の場合、適切にクリーンアップされていないオブジェクトがありました。通常の状況では、この問題はメモリ リーク テスト中に発生します。ただし、この特定の問題は、実際のクライアントのインストールでのみ発生し、SMTP サーバーが予期しないエラー メッセージを返し、オブジェクトが「取り残された」状態になり、実行ループが最終的にそれをクリーンアップしようとしたときに停止しました。

短い答え

実行ループでのクラッシュは、コード内の任意のオブジェクトが原因で発生する可能性があります。問題のシナリオを再現し、メモリ リークをテストして違反者を見つけます。

于 2011-10-20T10:33:31.147 に答える
5

これがあなたの質問に正確に答えていないことはわかっていますが...

サンプルコードがないので、これがオプションかどうかはわかりませんが、NSTimer を検討したことはありますか? n 秒ごとにコードを実行するのに非常に使いやすいです。

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(timerTarget:) userInfo:nil repeats:YES];

myTimer は、クラスの NSTimer プロパティです。

完了したら、これ以上電話をかけたくありません。

[self.myTimer invalidate];
self.myTimer = nil;
于 2011-10-19T01:51:42.613 に答える