首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >11 not错误:变量不可用

11 not错误:变量不可用
EN

Stack Overflow用户
提问于 2012-10-23 23:18:48
回答 3查看 15K关注 0票数 32

以下是我的两行代码:

代码语言:javascript
复制
NSString *frontFilePath = [[NSBundle mainBundle] pathForResource:[self.bookendFileNames objectAtIndex:self.randomIndex] ofType:@"caf"];
NSLog(@"frontFilePath = %@", frontFilePath );

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

代码语言:javascript
复制
(lldb) po frontFilePath

但我得到了以下错误:

代码语言:javascript
复制
error: variable not available

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

至于它的价值,我正在尝试调试第一行,因为它有时返回NULL,但是到目前为止,我还无法找出原因。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-24 01:27:56

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

这可能是编译器输出调试信息的一个缺点。有时,编译器会将变量复制到寄存器中供其使用,并且只列出调试信息中的注册位置。稍后,寄存器被重新定位为其他用途;值仍然存在于堆栈中,但是编译器没有告诉调试器可以在那里找到值。

要真正判断它是否是不充分的调试信息,或者该值是否真的不存在于该特定指令中,唯一的方法是手动检查程序集代码。一旦使用编译器启动优化,源代码就会变成一个弱视图,可以查看实际以任何特定顺序执行的内容。

我强烈建议关闭构建的优化级别( Build Settings中的优化级别),并以这种方式(如果可能的话)对其进行调试,而不是在优化代码调试的世界中徘徊太远。如果您确实需要通过优化来调试您的应用程序,请确保您正在使用Xcode支持的最新Apple LLVM编译器构建--始终有改进优化代码调试的工作要做,并且您希望能够利用最新的工具。

票数 45
EN

Stack Overflow用户

发布于 2020-09-02 15:13:58

诊断中的“地址清除器”似乎也使变量的值不可用。

Schemes > Run > Diagnostics > Address Sanitizer

票数 3
EN

Stack Overflow用户

发布于 2018-11-12 11:29:58

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

转弯

代码语言:javascript
复制
let foo = Bar().string

转到

代码语言:javascript
复制
var foo = Bar().string

以便使优化跳过此变量。请注意,这可能不会在所有情况下都有效。

在这种情况下,一个好的ol‘debugPrint()可以帮助您解决问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13040777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档