为什么在使用lldb调试时有时候无法使用'self'关键字?

14
每次(或几乎每次)在尝试在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:当我尝试打印本地变量时同样出现问题

(lldb) po currentUser
error: variable not available

如果我在代码中放置一些NSLog(),正确的值会被打印出来。但是使用po命令就不行了。

如果您在C函数内部,self实际上并不存在,因此查看断点周围的代码可能很有用。 - Ben S
@Benoit 我只使用 ObjC,并且我在 addPoints: 方法中,里面没有任何奇怪的东西。 - Ludovic Landry
4个回答

25

当我开启编译器优化时,通常会出现这个错误。编译器将生成代码,不一定遵循您的代码逻辑流程。

进入导航器中的项目->目标->构建设置->搜索优化级别->展开优化级别->选择调试行->在项目和目标的两列中都更改为无。

希望这可以帮助到您。


没问题。请记住,如果没有优化,应用程序将运行得更慢,因此,如果您正在运行计算密集型或AV密集型应用程序,则必须来回切换以正确测试您的应用程序。 - Khaled Barazi

5

我遇到了这个问题,当我编辑我的方案并将运行构建设置为Debug时,问题消失了。我之前将其设置为AdHoc以测试推送通知,这显然会让LLDB不开心。


5

因为它被优化掉了。让我们以一个例子来说明:

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.
}

编译器会进行许多操作,使得您的代码更快、更小;忘记无需使用的变量是一种非常常见的优化。


1

如在此问题中已经提到:

在构建设置中,将“预编译前缀头”设置为“否”对我有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接