lldb无法打印变量值,显示“error: reference to 'id' is ambiguous”错误。

46

自从我升级到xcode 4.3并将调试器切换到lldb后,任何打印成员变量的请求都会失败,并显示以下错误信息:

(lldb) print request
error: error: reference to 'id' is ambiguous
note: candidate found by name lookup is 'id'
note: candidate found by name lookup is 'id'
error: 1 errors parsing expression
'

'self' 是可以的:

'
(lldb) print self
(LoginViewController *) $6 = 0x1cd54d50

其他形式的打印成员变量也失败了:

(lldb) print self.request
error: property 'request' not found on object of type 'LoginViewController *'; did you mean to access ivar 'request'?
error: 1 errors parsing expression
(lldb) print self->request
error: error: reference to 'id' is ambiguous
note: candidate found by name lookup is 'id'
note: candidate found by name lookup is 'id'
error: 1 errors parsing expression

除此以外,似乎其他都正常工作。Xcode的变量窗口可以正确地检索值。我尝试过清除构建并删除~/Library/Developer/Xcode/DerivedData/。谷歌搜索没有显示任何相同问题的实例。

我在苹果的开发者论坛上找到了一个线程,但没有解决方案:

https://devforums.apple.com/message/623694

我已将此报告给苹果作为Bug ID# 11029004。


lldb仍然是一个正在进行中的工作。 - zaph
5
我想知道为什么如果是这样,苹果会在XCode 4.3中将它作为默认调试器。 - JosephH
1
由于某种原因,在苹果公司,调试器中显示实例变量的能力优先级较低。许多时候,通过@property语句自动创建的实例变量或在@implementation中声明的实例变量无法显示。尽管进展缓慢,但情况正在好转。请在bugreport.apple.com上提交一个错误报告。 - zaph
我有同样的问题,但只在我的主项目中出现,而不是在新生成的项目中。还没有弄清楚可能是什么原因... 库?C++? - nevyn
1
为了让lldb成为Xcode 4.3中的默认调试器,但是对于如此基础的东西却不能正常工作...肯定有其他问题。我尝试了p、po和print,但都无济于事。在这种状态下,lldb对我来说毫无用处。希望这只是一些容易解决的奇怪问题。与此同时,这是令人鼓舞的:http://lldb.llvm.org/status.html。我会在此期间提交一个错误报告。 - Joe D'Andrea
5个回答

39

我发现了一个解决方法:

在“产品”菜单下使用“编辑方案”,选择左侧栏中的“运行”,然后选择“信息”选项卡,并将调试器更改为gdb (对于不再具有gdb的Xcode 5无效)。

显然,苹果公司认为他们已经在Xcode 4.3.1中修复了这个bug,但它仍然存在。我提交了一些额外的调试信息供他们请求,因此我希望它会在下一个Xcode版本中得到修复。在4.3.2中仍然失败 。请参见https://devforums.apple.com/message/623694以获取来自Apple的更新。

更新

我尝试了各种我遇到的问题,并且他们都似乎在Xcode 4.4.1中使用lldb正常工作 - 因此,如果您遇到此问题,我强烈建议您升级。


非常好 - 谢谢!小修正: "编辑方案" 在 "产品" 菜单下。剩下的一样,它救了我的一天! - mpemburn
3
更新:Xcode 5已完全删除了gdb,并且你只能使用lldb功能齐全的调试器。 - Tom Redman

3
尝试使用以下表达式:
p self.view.bounds.size.width

或者使用,
po self.view

p - 打印只用于打印普通/简单的值, 而, po - 打印对象与 NSLog 相同,用于打印对象的值。


2
使用“Product”菜单下的“Edit Scheme”,在左侧栏中选择“Run”,然后选择“Info”选项卡,将调试器更改为gdb。
“Product”>“Edit Scheme”>“Run”(Schemes)>“Build Configuration”有三个选项(有些人可能只看到两个1、2) 1. Debug 2. Release 3. AdHoc
请仔细检查是否设置为“Debug”模式,如果没有,请将其设置为Debug。
这就是我犯的错误。

1
(Xcode5)这并不是对原问题的直接回答,但我认为它可能与之相关,并且我很讨厌想到其他人像我一样浪费了数小时来追踪它。我的问题是在调试窗口中没有显示任何变量值。我检查了实际给编译器的调用,并发现尽管工作区中的每个项目和目标都明确设置为-O0,而且此处提供的其他答案中提到的设置都已设置为Debug,但它仍然被优化为-Os。经过长时间的搜索,我发现每个项目“信息”部分中有一个名为“用于命令行构建的使用xxx”的选项,其中xxx是Debug/Release或可用的其他配置。根据工具提示描述,这个选项只应影响通过xcodebuild工具进行的命令行构建(这有点奇怪,因为该工具完全能够选择要使用的方案作为命令行选项)。无论如何,将此选项更改为Debug最终使IDE告诉编译器我想要-O0和-g。我不记得在相同的工作区中使用Xcode4时曾经发生过这种情况。
我还应该补充一点,您在更改此设置之前可能需要进行清理。我没有进行清理就更改了它,结果我的一些头文件找不到了(似乎预编译头文件没有正确生成)。在另一个小时左右的瞎猜中,我发现如果我先将上述选项设置回“Release”并进行清理,然后再将其设置为“Debug”,就可以成功构建。
有人知道Xcode开发团队是否真正使用它吗?我强烈感觉他们没有。

0
去“Product”-》“Scheme”-》“新建方案...”,为你的目标创建一个新的方案。 在“Product”-》“Clean”下清理你的产品,然后你的应用程序应该正常运行。
这样做解决了我的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接