Почему иногда "self" недоступно при отладке с lldb?
Много времени (когда это не каждый раз) Я получил следующую ошибку, когда пытаюсь напечатать объекты на lldb. Есть ли какая-либо конфигурация сборки/отладки для изменения или это ошибка внутри lldb?
(lldb) po userLevel
error: warning: Stopped in an Objective-C method, but 'self' isn't available; pretending we are in a generic context
error: use of undeclared identifier 'userLevel'
error: 1 errors parsing expression
Я строю с llvm и не снимаю символы отладки.
Изменить: Вот обратная трассировка:
(lldb) bt
* thread #1: tid = 0x1c03, 0x001169c5 FanCake-Beta`-[KWUserLevelController addPoints:](, _cmd=0x0029187b, points=15) + 179 at KWUserLevelController.m:53, stop reason = step over
frame #0: 0x001169c5 FanCake-Beta`-[KWUserLevelController addPoints:](, _cmd=0x0029187b, points=15) + 179 at KWUserLevelController.m:53
frame #1: 0x00112172 FanCake-Beta`-[KWEventRealTimeControllergameEngine:hostedGame:didSucceedIn:withScore:](self=0x0b9d7740, _cmd=0x0027a2a7, engine=0x1be5af40, game=0x1be5a850, completionTime=3.59473554800206, score=0) + 421 at KWEventRealTimeController.m:647
frame #2: 0x0007189a FanCake-Beta`__35-[KMCatchEmGameEngine animateStep6]_block_invoke197(, finished='\x01') + 257 at KMCatchEmGameEngine.m:214
frame #3: 0x01990df6 UIKit`-[UIViewAnimationBlockDelegate _didEndBlockAnimation:finished:context:] + 223
frame #4: 0x01983d66 UIKit`-[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 237
frame #5: 0x01983f04 UIKit`-[UIViewAnimationState animationDidStop:finished:] + 68
frame #6: 0x017587d8 QuartzCore`CA::Layer::run_animation_callbacks(void*) + 284
frame #7: 0x03634014 libdispatch.dylib`_dispatch_client_callout + 14
frame #8: 0x036247d5 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 296
frame #9: 0x04737af5 CoreFoundation`__CFRunLoopRun + 1925
frame #10: 0x04736f44 CoreFoundation`CFRunLoopRunSpecific + 276
frame #11: 0x04736e1b CoreFoundation`CFRunLoopRunInMode + 123
frame #12: 0x040367e3 GraphicsServices`GSEventRunModal + 88
frame #13: 0x04036668 GraphicsServices`GSEventRun + 104
frame #14: 0x01945ffc UIKit`UIApplicationMain + 1211
frame #15: 0x000039a8 FanCake-Beta`main(argc=1, argv=0xbffff354) + 94 at main.m:13
frame #16: 0x00002dc5 FanCake-Beta`start + 53
Изменить 2: То же самое, когда я пытаюсь напечатать локальные vars
(lldb) po currentUser
error: variable not available
Если я поместил в код NSLog(), правильное значение будет напечатано. Но не с командой po
.
Ответы
Ответ 1
Я обычно получаю эту ошибку, когда включена оптимизация компилятора. Компилятор будет генерировать код, который не обязательно будет следовать вашему логическому потоку кода.
Переход к вашему проекту в навигаторе → Целевая → Настройки сборки → Поиск уровня оптимизации → Расширение уровня оптимизации → выберите строку отладки → изменить на none в обоих столбцах вашего проекта и цели.
Надеюсь, что это поможет.
Ответ 2
У меня была эта проблема, и она исчезла, когда я отредактировал мою схему и установил Run build to Debug. Я установил его в AdHoc для тестирования Push Notifications, и это, по-видимому, делает LLDB недовольным.
Ответ 3
Потому что он оптимизирован. Пусть используется пример:
void f(int self) {
// Here, "self" is live:Its value is used in the call to NSLog()
NSLog(@"I am %d",self);
// Here, "self" is dead: Its value is never used.
// I could do self=0 or self=self*self and nobody would know.
// An optimizing compiler will typically optimize it away.
// It might still be on the stack (in the parameters passed to NSLog())
// but the compiler shouldn't assume this.
NSLog(@"Another function call: %d", 1);
// If "self" was on the stack, it will probably now have been overwritten.
}
Составители делают много вещей, чтобы сделать ваш код быстрее/меньше; забывая о переменных, которые больше не нужны, является очень распространенной оптимизацией.
Ответ 4
Как уже говорилось в этом другом question:
В настройках сборки, для параметра Precompile Prefix Header для NO установлено это для меня.