Подтвердить что ты не робот

Как отладить ошибку EXC_BAD_ACCESS

Я получил сообщение об ошибке

EXC_BAD_ACCESS code = 2 at0xb0987654

Мне интересно, как распечатать значение на 0xb0987654?

4b9b3361

Ответ 1

Чтобы отладить EXC_BAD_ACCESS, вы можете узнать, где находится оборванный указатель, включив объекты зомби.

Xcode

Выберите схему редактирования, затем вкладку "Диагностика" в разделе "Выполнить", затем щелкните "Объекты зомби".

AppCode

Выберите цель редактирования и добавьте следующую переменную среды:

NSZombieEnabled=YES

Другой причиной для EXC_BAD_ACCESS может быть бесконечная рекурсия, которая может быть найдена путем добавления некоторых протоколов.

Обновление для С++:

Чтобы отладить оборванные указатели на С++ с помощью компилятора Clang, попробуйте использовать Адрес Sanitizer (ASAN) от Google.

Ответ 2

Похоже, что вы пытаетесь написать на кодовую страницу или что-то еще? EXC_BAD_ACCESS описан в /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. */

И от kern_return.h:

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

Вы можете видеть ГДЕ, что адрес находится в вашем двоичном файле, выполнив:

(lldb) image lookup -va 0xb0987654

Но вам действительно нужно выяснить, кто там пишет. Если проблема проста, это может сказать вам, что неправильно, но, по словам Джаспера, это, вероятно, некоторая польза послезабота или другая подобная проблема, а плохой актер давно ушел к тому времени, когда вы рухнули. guardmalloc также иногда может улавливать такую ​​ошибку (вы можете включить это в Xcode в схеме "Запуск".)

Ответ 3

Определите, что вы сделали, что вызвало сбой. Сбой при просмотре определенного вида контроллера didLoad или в методе делегата или в конкретном действии. Это часто поможет найти объект, который вызывает ошибку.

  • В большинстве случаев "NSZombies" может помочь идентифицировать мертвый объект. Вы можете включить NSZombies, отредактировав свою схему Product → Edit Scheme → Diagnostics.
  • Если вы все еще не находите основную причину, тогда всегда возвращайтесь от контроллера дочернего представления к контроллеру родительского представления, чтобы узнать, какой объект нужно сохранить или какое сообщение нужно передать должным образом.
  • Посмотрите на статический анализатор и инструменты для расширенной отладки.

Надеюсь, это поможет вам.

С уважением, GISON