Подтвердить что ты не робот

Получение информации о неправильном адресе памяти в LLDB

Я пытаюсь отладить EXC_BAD_ACCESS в моем приложении iPhone. Он разбивается на вызов метода, а на линии метода - EXC_BAD_ACCESS (code=1, address = xxx).

До этого я бы просто использовал gdb info malloc-history <xxx> для начала отладки, но мне трудно найти параллельную команду в LLDB.

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

Мне просто нужно выяснить, на что указывает эта часть памяти, которая рушится. Каков наилучший способ сделать это с помощью LLDB или инструментов?

4b9b3361

Ответ 1

Эта проблема очень легко решить с помощью информативной обратной линии. К сожалению, с последней версией iOS и Xcode, хорошей трассировкой стека иногда бывает трудно. К счастью, вы можете установить "Исключительную точку останова" в Xcode, чтобы вы могли изучить этот код до исключения EXC_BAD_ACCESS.

  • Откройте навигацию точки останова в Xcode 4 (это выглядит как прямоугольник с точкой справа)
  • Нажмите кнопку "+" в левом нижнем углу и добавьте "Исключительная точка останова". Убедитесь, что вы нарушаете "On Throw" для исключений "Все".

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

Ответ 2

Вы можете увидеть стек malloc, если вы отлаживаете использование инструментов.

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

Чтобы найти историю malloc с помощью инструментов:

  • Профиль вашего проекта
  • Выберите Зомби из списка инструментов enter image description here
  • Сделать приложение причиной проблемы
  • На этом этапе вам будет представлен адрес, который уже был освобожден, и вы можете изучить его. enter image description here На данный момент нужно просто рассмотреть историю malloc. Я зачеркнул части, у которых были имена классов/проектов, характерные для работы, которую я делаю, но я думаю, что суть и полезность того, как нужно получать эту информацию, присутствует.

Последнее слово

Проблема, с которой я столкнулся, дала сообщение вроде:

*** - [someClass сохранить]: сообщение отправлено на освобожденный экземпляр 0x48081fb0 someProject (84051,0xacd902c0) malloc: запись malloc стеки на диск с помощью стандартного рекордера

Я был действительно озадачен, когда этот retain исходил с тех пор, как код, который он ломал, не имел ни одного (не в получателе или сеттере линии, в которой он был). Оказывается, я не звонил removeObserver:forKeyPath:, когда определенный объект был dealloc 'ed. Позже в исполнении KVO произошел с сеттер на линии, и это взорвало программу, так как KVO пыталась уведомить объект, который уже был выпущен.

Ответ 3

эту команду можно использовать в lldb:

image lookup --address 0xec509b

вы можете найти дополнительные команды по адресу: LLDB TO GDB COMMAND MAP

Ответ 4

Возможно, слишком поздно, но для дальнейшей помощи, на LLDB:

(lldb) p *(MyClassToPrint*)memory_address

например.

(lldb) p *(HomeViewController*)0x0a2bf700