Problème bizarre : CFRunLoopRunSpecific
Philippe49
Membre
Une appli qui marchait si bien depuis 6 mois ! puis Passage au nouveau simulator 3.0 et device 3.0 :
et là une méchanceté, la mouche dans le lait :
malloc_error_break : double free sur 0x..
Je passe sur Instruments. le bug est difficile à faire apparaà®tre ( 10-15 minutes), et j'ai une pile d'instructions qui finit par ... CFRunLoopRunInMode , CFRunLoopRunSpecific
Ben là , je sèche complètement. Cela ne se passait pas depuis 8 mois que l'appli existe au niveau des timers et animations. Les dernières modif ne semblent pas être la cause, car j'ai essayé avec la version N-1 .
A quoi peut référer ce CFRunLoopRunSpecific ?
- On fait agir plusieurs fois l'interface : CABasicAnimations, timers relativement nombreux, Changement de view controllers, ajout/suppressions de vues, changement de fond d'écran, etc..
- On laisse reposer quelques minutes
et là une méchanceté, la mouche dans le lait :
malloc_error_break : double free sur 0x..
Je passe sur Instruments. le bug est difficile à faire apparaà®tre ( 10-15 minutes), et j'ai une pile d'instructions qui finit par ... CFRunLoopRunInMode , CFRunLoopRunSpecific
Ben là , je sèche complètement. Cela ne se passait pas depuis 8 mois que l'appli existe au niveau des timers et animations. Les dernières modif ne semblent pas être la cause, car j'ai essayé avec la version N-1 .
A quoi peut référer ce CFRunLoopRunSpecific ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
En consultant la liste des threads alloués par mon application, le thread qui est cité dans le rapport d'Instruments, n'a pas été créé par mon appli
Voici la pile d'exécution
Je ne sais pas si tu sais comment fonctionnent les runloops, en Cocoa et en général. Il s'agit tout simplement de boucles qui attendent qu'un événement arrive pour se réveiller. C'est typiquement ce qui est utilisé pour le thread principal (qui est le seul thread pour lequel la runloop est créée, configurée et exécutée automatiquement, pour tes threads secondaires si tu veux une runloop il faut la configurer et lancer, un peu à l'image des NSAutoreleasePools), pour "watcher les events" tels que les interactions utilisateurs par exemple.
Une RunLoop peut avoir comme source des données arrivant sur un NSPort, des timers (c'est la runloop qui est en charge d'exécuter les actions associées au NSTimers aux bons moments, en vérifiant les fireDates à chaque itération de la runlopp... c'est pas magique un NSTimer hein faut bien que qqun s'en occupe :P), ou des invocations demandées par un autre thead et empilées pour exécution (tous les performSelector:onThread:withObject:waitUntilDone:, c'est la RunLoop qui dépile ces "demandes" d'invocations de méthodes et les exécute).
D'ailleurs si tu crées un thread secondaire, et que tu demandes [tt]performSelector:... onThread:tonThreadSecondaire withObject:... waitUntilDone:...[/tt] alors que ton thread secondaire n'a pas de RunLoop, le selector ne sera jamais "performed"... tu peux toujours attendre. (J'ai d'ailleurs eu le problème récemment, et je me suis arraché les cheveux une journée entière dessus pour capter que ça venait de là )
Maintenant, pour ton bug plus particulier, le pb quand ça plante dans une RunLoop, c'est que c'est vraiment difficile de savoir d'où ça vient... car justement c'est les CFRunLoops qui gèrent toutes les actions "en attente" ou "en arrière plan"... Donc ça peut avoir planté sur un performSelectorOnMainThread qui vient d'être dépilé par la runloop, par l'exécution d'un timer, ... va savoir. En tout cas bon courage :-/
Tu adoptes quelque stratégie vis-à -vis du didReceiveMemoryWarning: ?
En tout cas pour l'instant je n'ai jamais pris la peine de faire du StressTest sur mes applications et peu de Memory Allocations & Leaks tests (j'ai lancé Instruments pour vérifier les Leaks des fois, mais suis pas allé bcp plus loin dans l'analyse), d'autant que ce sont des applications qui n'ont encore jamais été publiées sur l'AppStore... mais il va falloir que je commence à le faire sous peu car ce genre de cas va vite venir...
Moi pareil
Il n'y a pas d'option Garbage Collector . Je ne l'utilise pas par ailleurs ( je ne me rappelle plus d'ailleurs si il est disponible sur iPhone ) mais je n'aimerais pas qu'il soit activé par défaut.
Première réponse partielle : Avec GCC 4.0, UIKIT_EXTERN @interface UILocalizedIndexedCollation : NSObject ne passe pas
GCC 4.2 est donc nécessaire.
Le message qui suit signifie bien que le programme (re)désalloue une variable entière ?
Et est-ce que dans GCC 4.2, une telle instruction peut poser problème ?
Je savais même pas que ce genre d'écriture était acceptée par le compilateur :P
Je n'ai jamais utilisé de tableaux "inline" comme cela en 20 ans de programmation en C (je déclare le tableau comme n'importe quelle variable locale plutôt...), et c'est également la première fois que je le vois...
Oui si la variable est toujours définie, ce qui est le cas si NSZombieEnabled est activée.
[/quote]
Il n'y a pas de raison, c'est du C standard.
Bon, c'était une imbrication de timers mal agencée dans certaines configurations ...