以下是我的两行代码:
NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"];
NSLog(@"frontFilePath = %@", frontFilePath );我在第二行放置了一个断点,当它出现时,我尝试打印它:
(lldb) po frontFilePath但我得到了以下错误:
error: variable not available我很困惑,因为如果我跳过NSLog语句,变量确实会打印到控制台。
至于它的价值,我正在尝试调试第一行,因为它有时返回NULL,但是到目前为止,我还无法找出原因。
发布于 2012-10-24 01:27:56
这是调试优化代码的工件。当编译器的优化在您的构建设置中启用时,它会在内存和寄存器之间移动变量,因为它认为这是最好的。在您检查lldb中的变量时,它可能根本不存在于寄存器或内存中--尽管它看起来仍然可以显示。
这可能是编译器输出调试信息的一个缺点。有时,编译器会将变量复制到寄存器中供其使用,并且只列出调试信息中的注册位置。稍后,寄存器被重新定位为其他用途;值仍然存在于堆栈中,但是编译器没有告诉调试器可以在那里找到值。
要真正判断它是否是不充分的调试信息,或者该值是否真的不存在于该特定指令中,唯一的方法是手动检查程序集代码。一旦使用编译器启动优化,源代码就会变成一个弱视图,可以查看实际以任何特定顺序执行的内容。
我强烈建议关闭构建的优化级别( Build Settings中的优化级别),并以这种方式(如果可能的话)对其进行调试,而不是在优化代码调试的世界中徘徊太远。如果您确实需要通过优化来调试您的应用程序,请确保您正在使用Xcode支持的最新Apple LLVM编译器构建--始终有改进优化代码调试的工作要做,并且您希望能够利用最新的工具。
发布于 2020-09-02 15:13:58
诊断中的“地址清除器”似乎也使变量的值不可用。
发布于 2018-11-12 11:29:58
在Swift中,可能从Xcode 9开始,仍然是Xcode 10中的一个问题,这甚至可能在构建设置中关闭代码优化时出现。正如@carlos_ms在这里指出的,临时解决方案是将变量定义为可变的,即
转弯
let foo = Bar().string转到
var foo = Bar().string以便使优化跳过此变量。请注意,这可能不会在所有情况下都有效。
在这种情况下,一个好的ol‘debugPrint()可以帮助您解决问题。
https://stackoverflow.com/questions/13040777
复制相似问题