Почему действительные объекты отображаются как Nil при использовании lldb? (Компилятор Apple LLVM 3.1, Xcode 4.3.1)

Я пытаюсь отладить какое-то причудливое поведение UIView и продолжаю сталкиваться со случаем, когда LLDB абсолютно бесполезен и вводит в заблуждение. Позвольте мне показать вам, что я имею в виду:

NSLog(@"myView: %@", myView);

2012-04-20 15:24:57.070 myProj[35789:f803] myView: <MyView: 0x7cc7500; frame = (0 119; 768 885); layer = <CALayer: 0x7cc8030>>

Но когда я устанавливаю точку останова именно в этот момент и пытаюсь использовать отладчик, он возвращает nil:

(lldb) po myView
(MyView *) $552 = 0x00000000 <nil>

Я бы попробовал перейти на GCC 4.2, чтобы посмотреть, поможет ли это, но компиляция под LLVM GCC 4.2 не вариант, так как это проект ARC.

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

(lldb) po self
(MyViewController *const) $51 = 0x07e92200 <MyViewController: 0x7e92200>
(lldb) po myView
(MyView *) $25 = 0x00000000 <nil>
2012-04-20 15:44:17.250 myProject[37551:f803] myView: <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>
(lldb) po 0x7e8e240
(int) $50 = 132702784 <MyView: 0x7e8e240; frame = (0 119; 768 885); layer = <CALayer: 0x7ea2330>>

Как я могу это исправить? Я даже пробовал self->myView, что тоже не сработало.

Обновление: (становится хуже!)

Я должен добавить, что в этом примере myView является переменной класса, а не свойством (где lldb связывает его с nil). Если я сделаю myView свойством класса и @synthesize его, lldb получит неверное, но предсказуемое значение и свяжет символ myView с самым последним синтезированным свойством ДО @synthesize. Итак, в моем случае код выглядел так:

@synthesize myDate=myDate_;
@synthesize myView;

Таким образом, при оценке свойства myView из LLDB отображается дата, хранящаяся в myDate_:

(lldb) po myView
(MyView *) $24 = 0x07ca0900 2008-01-08 05:00:00 +0000

В последнем случае, если я сделаю myView переменной метода, LLDB будет правильным:

(lldb) po myView
(UIView *) $7 = 0x07d81080 <MyView: 0x7d81080; frame = (0 119; 768 885); layer = <CALayer: 0x7d81b70>>

Это пахнет очень очевидной ошибкой в ​​самой LLDB.

Обновление 2:

Дальнейшее исследование: похоже, что ВСЕ свойства класса неверны! Первое свойство в списке показывает значение nil в LLDB, а все остальные показывают значение свойства, синтезированного прямо перед ним.

Может ли это быть странной ошибкой конфигурации?


person AlleyGator    schedule 20.04.2012    source источник
comment
Кстати, вам не нужно перекомпилировать приложение с интерфейсом gcc только для того, чтобы использовать gdb. Если вы хотите использовать gdb, просто измените отладчик для вашей схемы на gdb. Вы можете продолжить компиляцию с помощью LLVM3 и ARC.   -  person Firoze Lafeer    schedule 21.04.2012
comment
если myView является свойством, пытались ли вы просто получить доступ к самому свойству: po [self myView]   -  person Firoze Lafeer    schedule 21.04.2012


Ответы (3)


Убедитесь, что для вашей конфигурации сборки установлено значение «Отладка», а не «AdHoc», «Выпуск» или что-то еще, что удаляет символы отладки или запрещает отладку в файле прав.

Это просто укусило меня, потому что я забыл переключить конфигурацию обратно на отладку после создания специальной сборки для моего устройства. Как ни странно, большая часть приложения работала, но некоторые кадры стека молча и необъяснимо терпели неудачу со всеми переменными (включая self) либо нулевыми, либо искаженными.

person wdn    schedule 31.05.2012
comment
классно. :) Ты спас мою задницу - person alternatiph; 09.11.2014

frame variable -o myView

Подробнее здесь под заголовком "ИЗУЧЕНИЕ СОСТОЯНИЯ ФРЕЙМА СТЕКА".

person slf    schedule 20.04.2012
comment
(lldb) переменная кадра Ошибка myView: в этом кадре не найдена переменная с именем «myView» - person AlleyGator; 21.04.2012
comment
Параметр -O работает аналогично: (lldb) переменная фрейма -O ошибка myView: в этом фрейме не найдена переменная с именем 'myView' - person AlleyGator; 21.04.2012
comment
Итак, я понял, что проверял скорость на Симуляторе, и провел тестирование на устройстве. LLDB заработал отлично. Снова протестировано на симуляторе: снова сломано. Проверено на устройстве: снова исправлено. Так что я думаю, что мораль этой истории в том, что в LLDB могут быть неисправленные ошибки с симулятором. - person AlleyGator; 21.04.2012
comment
@AlleyGator отправьте отчет об ошибке с результатами вашего теста здесь: bugreport.apple.com - person slf; 23.04.2012
comment
Репортер ошибок Apple не работает. Как обычно. - person AlleyGator; 23.04.2012
comment
@AlleyGator, возможно, им следует подключиться к нему с помощью LLDB;) - person slf; 23.04.2012

Решение кажется таким: избегайте тестирования в симуляторе при попытке использовать отладчик. Как только я начал тестировать устройство, все сумасшествие исчезло, и оно заработало, как и ожидалось. Если я вернусь к симулятору, я снова увижу те же ошибки. Свойства и переменные метода, похоже, имеют проблемы в симуляторе.

person AlleyGator    schedule 23.04.2012
comment
рад слышать, что вы исправили это! :) - person slf; 23.04.2012
comment
Обновление по этому поводу: у lldb на Xcode 4.3.1 была ошибка при использовании симулятора. Я подал радар на это, и Apple исправила в 4.4.1. developer.apple.com/library/ios/releasenotes/DeveloperTools/ - person AlleyGator; 23.10.2012