Я пытаюсь отладить какое-то причудливое поведение 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, а все остальные показывают значение свойства, синтезированного прямо перед ним.
Может ли это быть странной ошибкой конфигурации?