繁体   English   中英

lldb 错误:变量不可用

[英]lldb error: variable not available

这是我的两行代码:

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

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

(lldb) po frontFilePath

但我收到以下错误:

error: variable not available

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

对于它的价值,我正在尝试调试第一行,因为有时它返回 NULL,但我现在无法弄清楚原因。

这是调试优化代码的神器。 当编译器的优化在您的构建设置中启用时,它会在内存和寄存器之间移动变量,因为它认为是最好的。 在您检查 lldb 中的变量时,它可能根本不存在于寄存器或内存中——即使它看起来应该仍可用于显示。

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

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

如果可能的话,我强烈建议关闭优化(构建设置中的优化级别)并以这种方式调试,而不是在优化代码调试的古怪世界中徘徊太远。 如果您确实需要通过优化调试应用程序,请确保您使用 Xcode 支持的最新 Apple LLVM 编译器进行构建 - 一直在努力改进优化代码调试,并且您希望充分利用自己到目前为止,您可以使用工具。

在 Swift 中,可能从 Xcode 9 开始,但在 Xcode 10 中仍然存在问题,甚至在构建设置中关闭代码优化时也会出现这种情况。 正如@carlos_ms 在这里指出的,临时解决方案是将变量定义为可变的,即

转动

let foo = Bar().string

进入

var foo = Bar().string

为了使优化跳过此变量。 请注意,这可能不适用于所有情况。

在这种情况下,一个好的 ol' debugPrint()可能会帮助你。

诊断中的“Address Sanitizer”似乎也使变量的值不可用。

方案 > 运行 > 诊断 > 地址清理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM