Ошибка lldb: свойство не найдено для объекта типа

Я пытаюсь отладить свое приложение iOS с помощью lldb и получаю действительно странные ошибки при отладке.

За несколько строк до точки останова у меня есть:

CGRect frame = view.frame;

К которому я могу получить доступ без проблем с помощью команды print frame в lldb. Однако, когда я снова пытаюсь получить доступ к кадру в lldb, я набираю print view.frame и получаю следующую ошибку:

error: property 'frame' not found on object of type 'UIView *'

Это не имеет смысла, поскольку я могу убедиться, что view является экземпляром UIView* и имеет допустимое свойство с именем frame, набрав po view и получив правильные результаты:

(UIView *) $4 = 0x1e199bf0 <MyAppCustomView: 0x1e199bf0; frame = (3398 3396; 204 208); layer = <CALayer: 0x1e199ce0>>

Эта конкретная ошибка lldb случается со мной часто, и я не мог найти причину этой ошибки. Кто-то предложил в количестве свойств 'not found on object of type' NSMutableArray * 'Команда PO в lldb, что можно было бы использовать gdb как (gdb) p view.frame, но я получаю error: '(gdb)' is not a valid command., и я очень подозреваю, что команда gdb "сработает?" в любом случае внутри другого отладчика.

Есть ли предложения или обходные пути для этой случайной ошибки?


person Can Poyrazoğlu    schedule 23.12.2012    source источник
comment
уже пробовал: ошибка: нет известного метода '-frame'; передать сообщение, отправленное в тип возвращаемого значения метода   -  person Can Poyrazoğlu    schedule 23.12.2012
comment
print [(UIView *) view frame] тоже не работает   -  person Can Poyrazoğlu    schedule 23.12.2012
comment
печать (CGRect) [рамка просмотра]   -  person Nate Chandler    schedule 23.12.2012
comment
Иногда такое случается и со мной. В этом случае я просто использую NSLog () или назначаю его временному объекту / структуре, который я напечатаю с помощью lldb.   -  person Ramy Al Zuhouri    schedule 23.12.2012
comment
@RamyAlZuhouri - это обходной путь, но он не очень удобен, пока вы отлаживаете и нуждаетесь в значении какой-либо переменной, а вы не занесли ее в журнал.   -  person Can Poyrazoğlu    schedule 23.12.2012
comment
Похоже, вам нужно использовать GDB вместо LLDB, см. Здесь: stackoverflow.com/questions/9515630/   -  person Ramy Al Zuhouri    schedule 23.12.2012


Ответы (3)


Точечная нотация для отправки сообщений не поддерживается в lldb при использовании Objective-C. Используйте скобки и приведите результат к CGRect:

p (CGRect)[view frame]
person Nate Chandler    schedule 23.12.2012
comment
(lldb) p [просмотр кадра] ошибка: не известен метод '-frame'; передать сообщение, отправленное в тип возвращаемого значения метода - person Can Poyrazoğlu; 23.12.2012
comment
после редактирования все заработало. какие-либо причины, по которым я должен явно использовать это? и какие-либо идеи, почему это иногда происходит, а в противном случае lldb просто работает безупречно с po / print без каких-либо приведений? - person Can Poyrazoğlu; 23.12.2012
comment
@ canpoyrazoğlu Поскольку, когда LLDB запрашивает среду выполнения, ему не известны типы не-объектов, которые вы хотите распечатать, приведение дает ему обещанный тип. - person CodaFi; 23.12.2012
comment
@CodaFi Хорошо, теперь мне любопытно. Почему LLDB действительно заботится о типах? Почему бы ему просто не запустить код и не посмотреть, работает ли он? - person moonman239; 22.05.2015
comment
Ответ @ssdscott должен быть принятым ответом, он не работает без внешних правил - person inix; 31.07.2015

На всякий случай, что вышеперечисленное не работает (что не помогло мне, ищу фрейм для переменной ячейки, класс, производный от UITableViewCell): принудительное использование дополнительных круглых скобок, похоже, помогло маленькому паршивому мозгу lldb:

p ((CGRect)[cell frame])

presto magico:

(CGRect) $5 = origin=(x=0, y=0) size=(width=320, height=44)
person ssdscott    schedule 01.12.2013
comment
Этот ответ должен быть принятым ответом, поскольку этот lldb все еще жалуется без внешних скобок. - person inix; 31.07.2015
comment
Вышеупомянутая фраза в вашем ответе может изменить контекст, укажите, пожалуйста, конкретный ответ. - person Juan Boero; 31.07.2019

Мне пришлось отключить (снять флажок) Thread Sanitizer в Xcode> Product> Scheme> Edit Scheme> Run> Diagnostics. При включенном Thread Sanitizer мне не удалось получить доступ ко многим свойствам NSView (например, границам, кадрам) через LLDB.

person Andrew    schedule 29.06.2018