Отладка EXC_BAD_ACCESS в приложении для iPhone - PullRequest
0 голосов
/ 28 апреля 2010

Вот мой след стека. Где я могу это выяснить? Я перепробовал кучу NSLog () и не могу его отследить.

#0  0x94e9ced7 in objc_msgSend ()
#1  0x04936318 in ?? ()
#2  0x0259b252 in __CFRunLoopDoObservers ()
#3  0x0259a65f in CFRunLoopRunSpecific ()
#4  0x02599c48 in CFRunLoopRunInMode ()
#5  0x02ae7615 in GSEventRunModal ()
#6  0x02ae76da in GSEventRun ()
#7  0x0061dfaf in UIApplicationMain ()
#8  0x000051cc in main

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Когда приложение падает с этой трассировкой стека, откройте консоль отладки.

Если сбой происходит в симуляторе, введите:

display /s $ecx

Если на устройстве, введите это:

display /s $r1

Убедитесь, что NSZombieEnabled имеет значение OFF , когда вы делаете это.

Будет напечатано имя метода, который пытается вызвать система.

Способ, которым это работает, заключается в том, что при сбое происходит сбой при попытке получить доступ к методу, который вызывается, который не существует. Таким образом, имя метода хранится в регистре как C-String, и эти строки извлекают его из регистра и распечатывают.

0 голосов
/ 29 апреля 2010

Вот как я отследил это.

Во-первых, я ходил повсюду, используя:

NSLog(@"%s", __PRETTY_FUNCTION__, nil);

, чтобы максимально приблизиться к катастрофе. Когда я это сделал, я заметил, что объект становится нулевым, чего не должно было быть.

В этот момент GDB с NSZombieEnabled и Instruments сообщили об отсутствии зомби.

Я добавил NSLog-инг в dealloc и освободил методы объекта, с которым у меня была проблема. Наконец, я смог получить достаточно смысла, чтобы добавить точку останова в эти методы и каждый раз просматривать трассировку стека, когда обнаружил, что релиз вызывается пулом авто-релиза.

Я наконец понял, что не удерживаю то, чем должен был быть. Как только я его сохранил, бинго, проблема решена.

Тем не менее, рекомендации NSZombieEnabled и Instruments помогли с некоторыми другими ошибками, которые возникли с тех пор, так что спасибо всем.

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