Как мне посмотреть на объект в отладчике XCode? - PullRequest
30 голосов
/ 11 июня 2009

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

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

unrecognized selector sent to instance 0x1081ad0

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

Ответы [ 4 ]

42 голосов
/ 11 июня 2009

po 0x1081ad0

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

po [myArray objectAtIndex:0]

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

po 1

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

9 голосов
/ 11 июня 2009

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

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

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


Edit:

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

6 голосов
/ 11 июня 2009

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

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

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

    информационная строка * 0x1081ad0

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

0 голосов
/ 11 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...