2013-11-02 5 views
23

я получил ошибкуКак отлаживать EXC_BAD_ACCESS ошибка

код EXC_BAD_ACCESS = 2 at0xb0987654

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

+0

Я полагаю, вы не хотите распечатать значение по этому адресу, так что очень адрес ваша проблема в первую очередь. Что за то, что вы получили, - это вопрос, который нужно задать. – Jay

ответ

30

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

Xcode

Выберите схему редактирования, закладка затем Diagnostics в разделе Run, а затем выберите опцию "Zombie Objects.

AppCode

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

NSZombieEnabled=YES 

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

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

Для отладки оборванных указателей в C++ с Clang компилятора попытаться использовать Address Sanitizer (ASAN) от Google.

+2

Я пробовал, бесполезно. Потому что это код C++, вызывающий проблему. –

+0

@AdamLee Как насчет этого тогда? http://stackoverflow.com/questions/3199067/c-catching-dangling-reference –

+0

@AdamLee, Уп выглядит, как MudFlap только gcc, обновлено для Clang/llvm –

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 в схеме запуска.)

+7

' image lookup -va 0x1586470c4' в lldb дает мне никакого вывода вообще, даже сообщение об ошибке. –

+0

В настоящее время «просмотр изображения -a» просто распечатывает то, что он может найти по заданному адресу, даже в случае «без символов по этому адресу», когда это ничего. LLDB должен действительно печатать некоторую ошибку, если она не может найдите любые символы, связанные с данным адресом. Пожалуйста, напишите ошибку об этом либо с репортером ошибок Apple, либо с lldb.llvm.org bugzilla. Благодарю. –

0

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

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

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

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

Смежные вопросы