Есть приложение, которое является iOS-приложением с приложением расширения сообщений. Они совместно используют значительный объем кода, связанного с вычислением и редактированием размеров некоторых специализированных объектов, а затем используют его для создания путей для рисования.
Приложение работает отлично. Сбой сборки приложения Сообщения EXC_BAD_ACCESS code=2
, по-видимому, в общем коде. Не повезло в его отладке, так как место сбоя, казалось, изменилось, когда я добавил лог-операторы и изменил код.
Так что я сосредоточился на основном приложении. Первой попыткой было включение Address Sanitizer, и это привело к сбоям, которые обсуждались ниже. Затем я отредактировал схему для поиска зомби, и ни один из них не был идентифицирован, в том числе в инструментах. Отсутствие утечек памяти или других очевидных ошибок распределения с помощью инструментов. Я отредактировал схему включения Malloc Scribble, Malloc Guard Edges и Guard Malloc, и приложение работало нормально, без сообщений о сбое или журнале консоли.
Итак, вернемся к Address Sanitizer, который является единственной опцией, которая вызвала сбой основного приложения и произошел сбой в той же области, что и приложение Сообщения. Я подумал, что если бы я решил один, я мог бы решить и то и другое, и приложение могло бы быть легче отлаживать без усложнения, являющегося расширением.
Кажется, что каждая ссылка, которую я искал и читал, говорила, что эта диагностика Xcode идентифицирует (или должна) идентифицировать код, вызывающий сбой, и в годы написания Swift это типичный случай. Это меня поставило в тупик.
Контроллер основного вида - UICollectionViewController
, и сбой происходит при самом первом collectionView(:cellForItemAt)
вызове. Нет ничего необычного в других вызовах делегатов, afaik, с нормальным (и точным) количеством и размерами. (И снова, это только с Address Sanitizer.) После получения многократно используемой ячейки, я вызываю getObjectEffects
с некоторыми значениями по умолчанию (приложение более сложное, но оно также зависало в этом сверхпростом жестко закодированном случае значений, поэтому я продолжаю отладку как можно проще), и EXC_BAD_ACCESS
определено для определения функции этой функции.
Вот что меня озадачивает. Это не идентификационный код, где есть присваивание или распределение, а оператор func. И параметры Int
и Bool
. И есть нулевой вывод на консоль, где я также пробовал (lldb) command script import lldb.macosx.heap
и (lldb) malloc_info —type 0x...
без результата. Как уже упоминалось, я попробовал Zombies и другие диагностические средства управления памятью Xcode, не зная, почему Address Sanitizer дает сбой при операторе func с EXC_BAD_ACCESS
, и я не уверен, как это диагностировать дальше.
Что я пропустил? Спасибо за любые идеи.
![enter image description here](https://i.stack.imgur.com/LH22e.png)
![enter image description here](https://i.stack.imgur.com/2VYcp.png)
Редактировать: В конечном итоге прогресс был достигнут благодаря переключению кода и поиску других результатов. Возможное «решение» нелогично в том смысле, что я не могу понять, как оно должно логически создавать какой-либо другой результат, но это так. И поскольку он не дает представления о первоначальном вопросе о том, как диагностировать причину EXC_BAD_ACCESS, я не буду здесь его подробно описывать. Пока это будет «разгаданной» загадкой.