web-dev-qa-db-fra.com

Comment déboguer un bogue EXC_BAD_ACCESS

J'ai reçu une erreur

EXC_BAD_ACCESS code = 2 at0xb0987654

Je me demande comment imprimer la valeur à 0xb0987654?

24
Adam Lee

Pour déboguer un EXC_BAD_ACCESS, vous pouvez généralement savoir où se trouve le pointeur suspendu en activant les objets zombie. 

Xcode

Choisissez modifier le schéma, puis cliquez sur l'onglet Diagnostics dans la section Exécuter, puis cliquez sur l'option "Objets Zombie". 

AppCode

Choisissez la cible d'édition et ajoutez la variable d'environnement suivante: 

NSZombieEnabled=YES

Une autre cause de EXC_BAD_ACCESS peut être une récursion infinie, qui peut être trouvée en ajoutant une journalisation. 

Mise à jour pour C++:

Pour déboguer des pointeurs en suspens en C++ avec le compilateur Clang, essayez d’utiliser Address Sanitizer (ASAN) de Google. 

31
Jasper Blues

On dirait que vous essayez peut-être d'écrire sur une page de code ou quelque chose de ce genre? EXC_BAD_ACCESS est décrit dans /usr/include/mach/exception_types.h:

#define EXC_BAD_ACCESS          1       /* Could not access memory */
            /* Code contains kern_return_t describing error. */
            /* Subcode contains bad memory address. */

Et de kern_return.h:

#define KERN_PROTECTION_FAILURE         2
            /* Specified memory is valid, but does not permit the
             * required forms of access.
             */

Vous pouvez voir où cette adresse est dans votre binaire en faisant:

(lldb) image lookup -va 0xb0987654

Mais ce qu'il faut vraiment savoir, c'est qui essaie d'y écrire. Si le problème est simple, cela peut vous dire ce qui ne va pas, mais comme le suggère Jasper, il s’agit probablement d’un problème lié à un usage gratuit ou à un autre, et le mauvais acteur a disparu depuis longtemps lorsque vous vous bloquez. guardmalloc peut aussi parfois intercepter ce type d'erreur (vous pouvez l'activer dans Xcode dans le schéma Run.)

2
Jim Ingham

Identifiez ce que vous avez fait pour causer le crash. Est-ce qu'il s'est bloqué lors de l'affichage d'un contrôleur de vue particulier dans une méthode déléguée ou lors d'une action particulière. Cela aidera souvent à trouver l’objet qui cause l’erreur.

  • La plupart du temps, les «NSZombies» peuvent aider à identifier l'objet mort. Vous pouvez activer NSZombies en modifiant votre modèle Product -> Edit Scheme -> Diagnostics.
  • Si vous ne trouvez toujours pas la cause première, revenez toujours du contrôleur de vue enfant à contrôleur de vue parent pour voir quel objet doit être conservé ou quel message doit être transmis correctement.
  • Examinez Static Analyzer et Instruments pour un débogage avancé. 

J'espère que cela t'aidera.

Cordialement, Gison

0
Gison George