lldb错误:变量不可用

ari*_*old 25 xcode objective-c ios lldb

这是我的两行代码:

NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"];
NSLog(@"frontFilePath = %@", frontFilePath );
Run Code Online (Sandbox Code Playgroud)

我在第二行放了一个断点,当我在那里时,我尝试打印它:

(lldb) po frontFilePath
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

error: variable not available
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为如果我跳过NSLog语句,变量确实打印到控制台.

为了它的价值,我正在尝试调试第一行,因为有时它会返回NULL,所以我不能,如现在,找出原因.

Jas*_*nda 42

这是调试优化代码的工件.在构建设置中启用编译器优化时,它会在内存和寄存器之间移动变量,因为它决定最佳.在您检查lldb中的变量时,它可能根本不存在于寄存器或内存中 - 即使看起来它仍然可用于显示.

它可能是编译器输出的调试信息的缺点.有时,编译器会将变量复制到寄存器中以供其使用,并且仅在调试信息中列出该寄存器位置.之后,登记册被重新用于其他用途; 值仍然存在于堆栈中,但编译器没有告诉调试器可以在那里找到值.

真正判断调试信息是否不足或者该特定指令中是否存在该值的唯一方法是手动检查汇编代码.一旦您使用编译器打开优化,源代码就会变成对任何特定顺序实际执行内容的弱视图.

我强烈建议关闭优化(构建设置中的优化级别)以进行构建并以这种方式进行调试(如果可能的话),而不是漫无目的地进入优化代码调试的古怪世界.如果您确实需要通过优化调试您的应用程序,请确保您使用Xcode支持的最新Apple LLVM编译器进行构建 - 始终有一些工作要做,以改进优化的代码调试,并且您希望利用自己的最大优势迄今为止的工具.

  • Swift是如此糟糕,以至于如果你有一个变量,`let`将"opti-mi-ze it",因为它认为你不想再修改它,所以为什么还要为你保存一个引用,即使你有优化级别为NONE.改变````换`var`,它*可能* - 只是 - 可能会起作用. (8认同)
  • 即使优化已被关闭,我仍然有时会遇到这个问题. (4认同)
  • 不,即使完全禁用优化也会发生这种情况。 (3认同)
  • 顺便说一句-我在答案的细节中被忽略了-lldb的意思是,在这个特定的指令点,它不知道如何找到变量的值。那时该变量可能不可用,或者编译器的调试信息可能描述不充分,但是鉴于它必须使用的内容,lldb现在无法执行任何操作。 (2认同)
  • 我在发布模式而不是调试时碰到了这个,感谢这个答案,帮助我更快地发现并恢复:) (2认同)