Ответ 1
po 0x1081ad0
po = объект печати. Вы даже можете вызвать методы, например
po [myArray objectAtIndex:0]
Обратите внимание, что он работает только с объектами, поэтому
po 1
приведет к сбою вашей программы.
У меня есть простой вопрос об отладке на Xcode и GDB.
Я часто сталкиваюсь с ошибкой:
unrecognized selector sent to instance 0x1081ad0
что делает загрузку программы в GDB. Есть ли простой способ проверить, какой экземпляр находится в этой памяти из GDB?
po 0x1081ad0
po = объект печати. Вы даже можете вызвать методы, например
po [myArray objectAtIndex:0]
Обратите внимание, что он работает только с объектами, поэтому
po 1
приведет к сбою вашей программы.
Стивен прав - команда gdb po
является ярлыком для print-object
, который на самом деле вызывает -debugDescription
(не -description
, как и следовало ожидать) на объекте, предоставленном в качестве аргумента. Во многих случаях вы увидите тот же результат от обоих методов, так как один вызывает другой, если не переопределить. (Дополнительную информацию см. В соответствующей надписи Примечание: на этой технологии Apple. Обратите внимание, что в их примере кода po $r3
печатает содержимое регистра PowerPC, но вы можете использовать любой указатель/ссылку на объект, включая регистры Intel и т.д.)
Кроме того, имейте в виду, что print-object
будет работать только с действительными объектами, которые не были освобождены. Это не поможет вообще, если вы отправляете сообщение на borked указатель. Однако, учитывая указанную вами ошибку, кажется, что это действительный экземпляр объекта, он просто не реализует метод, который вы пытаетесь вызвать.
Также возможно, что объект уже был уничтожен. Этот ответ должен помочь в этом случае.
Edit:
Существуют и другие способы "исследовать" объекты в отладчике. Я спросил этот вопрос SO о форматировщиках данных Xcode, что является одним из способов определить, как пользовательский класс появляется в столбце "Сводка" отладчика. Документация, связанная с этим вопросом, объясняет, как это работает. Я нашел сводный подход, чтобы много помочь с просмотром состояния объекта.
Есть несколько вещей, которые вы можете сделать.
В качестве альтернативы вы можете увидеть, какой объект находится в этом месте mem:
информационный символ 0x1081ad0 или
info line * 0x1081ad0
Там больше информации в запись в вики-записи cocoadev для обработки исключений и советы по отладке для цели C на кокосовой пальме.
Ваш экземпляр недействителен. Вы освобождаете объект в другом месте, но вы не очистили свой указатель... включите обнаружение зомби.