以下是我的两行代码:
NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"];
NSLog(@"frontFilePath = %@", frontFilePath );
我在第二行放置了一个断点,当我在那里时,我尝试打印它:
(lldb) po frontFilePath
但是我收到以下错误:
error: variable not available
我很困惑,因为如果我跳过NSLog语句,变量确实会打印到控制台。
为了它的价值,我正在尝试调试第一行,因为有时它返回NULL,所以我不能,到目前为止,找出原因。
答案 0 :(得分:41)
这是调试优化代码的工件。在构建设置中启用编译器优化时,它会在内存和寄存器之间移动变量,因为它决定最佳。在您正在检查lldb中的变量时,它可能根本不存在于寄存器或内存中 - 即使它看起来仍然可以显示。
这可能是编译器输出的调试信息的缺点。有时,编译器会将变量复制到寄存器中以供其使用,并且仅在调试信息中列出该寄存器位置。之后,登记册被重新用于其他用途;值仍然存在于堆栈中,但编译器没有告诉调试器可以在那里找到值。
真正判断调试信息是否不足或者在该特定指令中是否真正存在该值的唯一方法是手动检查汇编代码。只要您使用编译器打开优化,源代码就会变成对以任何特定顺序实际执行的内容的弱视图。
如果可能的话,我强烈建议您在构建和调试方式中关闭优化(构建设置中的优化级别),而不是漫无目的地进入优化代码调试的古怪世界。如果您确实需要通过优化调试您的应用程序,请确保您使用Xcode支持的最新Apple LLVM编译器进行构建 - 始终有一些工作要做,以改进优化的代码调试,并且您希望利用最多迄今为止的工具。
答案 1 :(得分:1)
在Swift中,可能从Xcode 9开始,而在Xcode 10中仍然是一个问题,甚至在构建设置中关闭代码优化时也可能出现这种情况。正如@carlos_ms在此指出的,一个临时解决方案是将变量定义为可变变量,即
转动
let foo = Bar().string
进入
var foo = Bar().string
为了使优化跳过此变量。请注意,这可能不适用于所有情况。
在这种情况下,好的debugPrint()
可能会帮助您。
答案 2 :(得分:1)
诊断程序中的“地址清理器”似乎也使变量的值不可用。