2011-10-19 2 views
4

Snow Leopardサーバーで数日から数週間実行されるアプリケーションがあります。 -[NSRunLoop runUntilDate:]を使用して10秒間「一時停止」し、タスクを実行してからもう一度一時停止します。 1時間以上実行した後、次のレポートで私のアプリがクラッシュ:一見NSRunloop runUntilDateによってアプリケーションクラッシュが発生する

クラッシュレポート

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オブジェクトがもはや有効で、したがって、深いCF内releaseメッセージであると思っていませんクラッシュを引き起こします。しかし、私はこれが当てはまるとは思わない。 前の行のcurrentRunLoopオブジェクトへの参照を取得する。

クラッシュ時間は1時間から1.5時間の間で異なりますが、原因を特定することはできません。 私は次に何をすべきか分からないので、コメントや意見やアイデアをデバッグすると大変感謝します。

EDIT:問題が解決 -私は、これは正確にあなたの質問に答えていない知っている

+0

失敗したメソッドからコードを投稿することはできますか? – NJones

答えて

3

下記の私の答えを参照してください、しかし...

私はこれはオプションであるかどうかわからないんだけど

、サンプルコードはありませんが、あなたはNSTimerを考慮していますか? n秒ごとにコードを実行するのはとても簡単です。

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

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

完了したら、もうコールしないでください。

[self.myTimer invalidate]; 
self.myTimer = nil; 
+0

ありがとうございます - 私はNSTimerを認識しており、他のアプリケーションでも使用しています。それは確かに解決策の1つですが、私はNSRunLoopに何が問題なのか、あるいは私のコードで何か他のものを見つけ出すことを好むでしょう。 – helioz

3

さらなる試験は、自分の質問に答えるために私を有効にしている:

を実行ループと間違って何もありません。それは、自動解放プール内のオブジェクトを解放するハンドルを実行する実行ループです。そのため、コードのいずれかの問題が実行ループに関連することが示されます。

私の場合、私は適切にクリーンアップされていないオブジェクトを持っていました。通常の状況下では、メモリリークテスト中にこの問題が発生していました。しかし、この特定の問題は、実際にクライアントがインストールされたときに発生したもので、予期しないエラーメッセージが返されたためにオブジェクトが「残っている」というメッセージが返され、実行ループが最終的にそれをクリーンアップしようとしたとき、実行ループにおいて

短い答え

クラッシュは、コード内の任意のオブジェクトによって引き起こされ得ます。問題のシナリオを再作成し、メモリリークをテストして犯罪者を探してみてください。

関連する問題