2011-10-19 3 views
4

J'ai une application qui fonctionne pendant des jours et des semaines sur un serveur Snow Leopard. Il utilise -[NSRunLoop runUntilDate:] pour "mettre en pause" pendant dix secondes, effectuer sa tâche, puis mettre en pause à nouveau. Après avoir exécuté pendant plus d'une heure, mon application se bloque avec le rapport suivant:NSRunloop runUntilDate provoque un plantage de l'application

Crash Report

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 

À première vue, je pensais que mon NSRunLoop objet est plus valide et donc le message release au plus profond de CF provoque un crash. Cependant, je ne pense pas que ce soit le cas J'obtiens la référence à l'objet currentRunLoop dans la ligne précédente. Le temps d'accident varie entre 1 et 1.5hrs mais je ne peux pas comprendre ce qui le cause. Tous les commentaires ou opinions ou idées de débogage seraient grandement appréciés car je ne sais pas quoi faire ensuite.

EDIT: problème résoudre - s'il vous plaît voir ma réponse ci-dessous

+0

Pouvez-vous envoyer du code à partir de la méthode défaillante? – NJones

Répondre

3

Je sais que cela ne répond pas précisément à votre question, mais ...

Je ne sais pas si cela est une option, puisqu'il n'y a pas de code d'exemple, mais avez-vous considéré un NSTimer? Ils sont très faciles à utiliser pour exécuter du code toutes les n secondes.

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

où myTimer est une propriété NSTimer de votre classe.

lorsque vous avez terminé et que vous ne voulez plus d'appels.

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

Merci - Je suis conscient de NSTimer et je l'utilise dans d'autres applications. C'est certainement l'une des solutions, mais je préférerais savoir ce qui ne va pas avec le NSRunLoop ou peut-être quelque chose d'autre dans mon code. – helioz

3

D'autres tests me ont permis de répondre à ma propre question:

Il n'y a rien de mal avec la boucle d'exécution. C'est la boucle d'exécution qui gère les libérations d'objets dans le pool d'autorelease. C'est la raison pour laquelle les problèmes de n'importe quelle partie du code peuvent être liés à la boucle d'exécution.

Dans mon cas, j'avais un objet qui n'a pas été nettoyé correctement. Dans des circonstances normales, ce problème s'est manifesté lors des tests de fuite de mémoire. Toutefois, ce problème particulier ne se posait que sur l'installation réelle du client lorsqu'un serveur SMTP renvoyait un message d'erreur inattendu qui provoquait la "restitution" d'un objet et lorsque la boucle d'exécution tentait de le nettoyer, il s'arrêtait net.

La réponse

tombe en panne dans la boucle d'exécution peuvent être causés par un objet dans le code. Essayez de recréer le scénario du problème et testez les fuites de mémoire pour trouver le contrevenant.

Questions connexes