EXC_BAD_ACCESS и Address Sanitizer каков следующий шаг? - PullRequest
0 голосов
/ 06 ноября 2018

Есть приложение, которое является 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

enter image description here

Редактировать: В конечном итоге прогресс был достигнут благодаря переключению кода и поиску других результатов. Возможное «решение» нелогично в том смысле, что я не могу понять, как оно должно логически создавать какой-либо другой результат, но это так. И поскольку он не дает представления о первоначальном вопросе о том, как диагностировать причину EXC_BAD_ACCESS, я не буду здесь его подробно описывать. Пока это будет «разгаданной» загадкой.

...