Выследить EXC_BAD_ACCESS без NSZombie? - PullRequest
1 голос
/ 24 июня 2010

Я потратил на это два дня и до сих пор не могу найти причину аварии.

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

Всякий раз, когда я пытаюсь найти источник в GoogleEXC_BAD_ACCESS люди предлагают использовать NSZombies.Проблема в том, что когда я включаю зомби (либо в xcode через переменную окружения, либо в инструменты через свойства ObjectAlloc), программа не падает, как обычно, и зомби ничего не сообщают (ничего не отображается в журналах и ничего не помечено винструменты).Есть ли что-то, чего мне не хватает в NSZombie?

Я пытался использовать некоторую информацию из отладчика xcode и из ObjectAlloc в инструментах, но вся информация очень загадочная и не очень мне помогает.

Я установил отладчик для остановкина цели c исключениями.Когда он это делает, это показывает стек вызовов:

0 objc_msgSend
1 ??
2 -[UITableViewCell removeFromSuperView]
3 -[UIView dealloc]
... etc ...

Прежде всего, что за сделка с '1 ??'?Что означают знаки вопроса?Во-вторых, как я могу узнать, где это было вызвано в моем коде?Все указанные операции являются слишком общими (например, UIView dealloc, но какой UIView? И где?).

Также, когда возникает исключение, оно указывает на ассемблерный код, который, опять же, не приносит мне никакой пользы, если я не былтратить часы, пытаясь выяснить, что делает код.Я знаю некоторую сборку, но там имеет , чтобы быть лучше ... правильно?

Есть ли какой-нибудь способ, которым я могу получить значимую информацию о том, какая строка была последней в моем кодедо того, как возникло исключение?

Я пытался разбросать некоторые NSLogs и точки останова, но это мне не очень помогает, потому что сбой происходит после Я выталкиваю контроллер представления из контроллера навигации.Везде, где я размещаю точки останова, точки останова достигаются нормально (я не могу найти точку, чтобы сломать после аварии).Исключение возникает только тогда, когда я «продолжаю» в отладчике.Как будто сбой происходит вне моего кода, поэтому я понятия не имею, где его найти.

Я просмотрел свой код и дважды проверил, что я придерживаюсь всех правил управления памятью (впо крайней мере, насколько мне известно).Я уверен, что это что-то очень тонкое, но я не могу его найти.

Если у кого-то есть идеи, как найти такие ошибки без NSZombie, пожалуйста, поделитесь.

Спасибо.

1 Ответ

1 голос
/ 24 июня 2010

Ну, я нашел проблему. У меня был собственный класс ячеек таблицы, в котором я сначала вызвал [super dealloc] в методе dealloc (а не в прошлом). Я думаю, что я написал этот класс в спешке и действительно не думал об этом. Я предполагаю, что что-то было выпущено в родителе, что ребенок должен был выпустить?

Так что у меня нет реального ответа на мой собственный вопрос, но в основном я нашел проблему, используя комбинацию специальной трассировки кода и различных методов отладки (точки останова, NSLogs, попытка расшифровать криптографическую трассировку стека и т. Д.).

На самом деле основной стратегией, которая помогла мне, было постепенное комментирование кода до тех пор, пока я не разобрал проблемную область настолько просто, насколько это возможно, при этом сохраняя сбой в целости и сохранности. Это позволило мне понять, что проблема была не там, где я думал, а в более тонкой области (например, в методе dealloc вторичного класса в данном случае).

Надеюсь, это может кому-то помочь. Я оставлю этот вопрос без ответа на некоторое время, если у кого-то есть более тщательная стратегия отладки, не полагаясь на NSZombies. Также, если кто-то сможет уточнить, что означают эти два знака вопроса в трассировке стека, это будет полезно.

...