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

Как посмотреть объект в отладчике Xcode?

У меня есть простой вопрос об отладке на Xcode и GDB.

Я часто сталкиваюсь с ошибкой:

unrecognized selector sent to instance 0x1081ad0

что делает загрузку программы в GDB. Есть ли простой способ проверить, какой экземпляр находится в этой памяти из GDB?

4b9b3361

Ответ 1

po 0x1081ad0

po = объект печати. Вы даже можете вызвать методы, например

po [myArray objectAtIndex:0]

Обратите внимание, что он работает только с объектами, поэтому

po 1

приведет к сбою вашей программы.

Ответ 2

Стивен прав - команда gdb po является ярлыком для print-object, который на самом деле вызывает -debugDescription (не -description, как и следовало ожидать) на объекте, предоставленном в качестве аргумента. Во многих случаях вы увидите тот же результат от обоих методов, так как один вызывает другой, если не переопределить. (Дополнительную информацию см. В соответствующей надписи Примечание: на этой технологии Apple. Обратите внимание, что в их примере кода po $r3 печатает содержимое регистра PowerPC, но вы можете использовать любой указатель/ссылку на объект, включая регистры Intel и т.д.)

Кроме того, имейте в виду, что print-object будет работать только с действительными объектами, которые не были освобождены. Это не поможет вообще, если вы отправляете сообщение на borked указатель. Однако, учитывая указанную вами ошибку, кажется, что это действительный экземпляр объекта, он просто не реализует метод, который вы пытаетесь вызвать.

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


Edit:

Существуют и другие способы "исследовать" объекты в отладчике. Я спросил этот вопрос SO о форматировщиках данных Xcode, что является одним из способов определить, как пользовательский класс появляется в столбце "Сводка" отладчика. Документация, связанная с этим вопросом, объясняет, как это работает. Я нашел сводный подход, чтобы много помочь с просмотром состояния объекта.

Ответ 3

Есть несколько вещей, которые вы можете сделать.

  • Вы можете вставить точку прерывания, которая будет запускаться каждый раз, когда у вас есть исключение, поэтому в основном создайте точку останова для этого (перейдите к точкам останова и создайте новый): - [NSException raise]
  • В качестве альтернативы вы можете увидеть, какой объект находится в этом месте mem:

    информационный символ 0x1081ad0 или

    info line * 0x1081ad0

Там больше информации в запись в вики-записи cocoadev для обработки исключений и советы по отладке для цели C на кокосовой пальме.

Ответ 4

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