2010-08-27 4 views
1

J'ai une application de défilement qui fonctionne bien sur le simulateur, cependant, lorsqu'il est installé sur le périphérique, il me donne un EXC_BAD_ACCESS, lorsque je tente de faire défiler une page. Je l'ai couru à travers des instruments avec des allocations et des fuites, mais rien n'est divulgué et aucun zombies ne sont envoyés ... Je suis simplement curieux de savoir ce qui pourrait causer une telle différence entre le simulateur et l'appareil? Toutes les façons de déboguer cela, puisque mon journal de crash symbolique (partiel ci-dessous), ne semble pas très symbolique.EXC_BAD_ACCESS sur le périphérique, mais très bien sur le simulateur

Exception Type: EXC_BAD_ACCESS (SIGBUS)
Codes d'exception: KERN_PROTECTION_FAILURE à 0x0000000F
Crashed Discussion: 0

Discussion 0 Crashed:
0 libobjc.A.dylib                   0x0000286e objc_msgSend + 18
1 MyApp                                 0x00004fee 0x1000 + 16366
2 UIKit                                     0x000668f4 - [voir UIViewController] + 104
3 MyApp                               0x00009716 0x1000 + 34582
4 MyApp                               0x0000960c 0x1000 + 34316
5 UIKit                                     0x0001426c - [UIScrollView setContentOffset:] + 344

Merci

+0

avez-vous accès à des données/supports stockés/téléchargés dans le répertoire de documents de votre application (par exemple, quelque chose sur le périphérique mais pas dans le bundle)? Je ne me souviens pas comment je l'ai résolu si .. ou si je faisais quelque chose de mal ..) – lukya

+0

J'ai quelques images mais ils sont tous dans les ressources et devraient donc être copiés sur l'appareil. C'est la seule chose à laquelle je peux penser. – joec

+0

S'il vous plaît vérifier, si elles sont vraiment copiées dans le paquet. Si c'est le cas, vous les trouverez ici: Navigateur "Groupes & Fichiers" -> "Cibles" -> Votre Cible -> "Recopier des Recours de Bundle". Sinon, ajoutez-le ici. – vikingosegundo

Répondre

2

Votre code dans le simulateur pourrait avoir le bug, mais ne déclenche pas EXC_BAD_ACCESS par la chance qu'un pointeur que vous déréférenciez ne soit pas dans la mémoire non mappée. Un pointeur pourrait être mauvais, et consulté, mais pas détecté - c'est toujours un bug.

Vous avez déjà vérifié que les zombies ne sont pas envoyés, ce qui aurait été ma première suggestion.

La prochaine chose à faire est d'activer la Garde Malloc - puis lire cette

http://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/Articles/MallocDebug.html

Vous ne pouvez le faire dans le simulateur - votre objectif est d'utiliser le tas extra-sensible à faire le bug lance EXC_BAD_ACCESS dans le simulateur.

Dans l'article:

  1. Regardez comment définir les variables GDB
  2. Lire la "Détection Heap Corruption" section
2

accès Bad sur l'appareil peuvent être causés pour beaucoup des raisons, la plupart d'entre eux liés au fait que l'appareil a moins de mémoire que le simulateur, Il serait plus tôt libéré de la mémoire libérée. La meilleure façon de trouver le problème est de lancer l'application sur le périphérique en mode débogage sans points d'arrêt (l'une des raisons pour cela est d'ajouter un point d'arrêt puis de le supprimer).Si vous pouvez reproduire le mauvais accès de cette façon, après l'avoir reproduit, vous pouvez voir la console du débogueur (cmd + shift + y) et vous verrez que le programme s'est arrêté à un point de rupture, puis aller sur la pile de threads pour voir le dernier appel que votre application a fait et a échoué, en accédant probablement à un mauvais pointeur.

+0

merci mon pote, j'ai trouvé mon problème en utilisant votre façon de trouver variable sous le problème de la mémoire .... Merci –

1

Je voudrais ajouter mon cas à la discussion . Je viens de résoudre un problème très similaire à celui-ci. Cela a fonctionné sur le simulateur mais a échoué sur l'appareil. Je pensais que c'était un problème de mémoire. Ce n'était pas.

Il s'avère que j'avais oublié le return sur une méthode non-vide. On s'attendait à retourner une valeur mais j'ai oublié de faire le retour tout à fait. Assez mauvaise erreur si vous me le demandez, mais elle s'est déroulée sans problème dans Simulator (même si le retour était en fait utilisé pour stocker la variable et en faire d'autres choses).

D'une manière ou d'une autre, le simulateur a fonctionné à chaque fois avec le retour oublié. Beats me comment, mais je ne peux que deviner que ce doit être la dernière variable que j'utilise dans le même endroit que le retour devrait pointer, ce qui entraîne un faux (faux mais correct) retour. Ensuite, il a fonctionné sur l'appareil et dans des conditions normales, il s'est écrasé à chaque fois. Il m'a fallu un déboguage étape par étape pour réaliser que je ne renvoyais pas correctement le résultat de la méthode défaillante.

Espérons que cela aidera tous ceux qui sont confrontés à ce problème!

Questions connexes