Xcode LLDB expr命令未更改变量

Xcode LLDB expr命令未更改变量,xcode,lldb,Xcode,Lldb,我正在尝试使用Xcode的LLDB控制台来更改变量。我想使用断点的调试器命令来执行此操作,这样我的程序执行就不会停止,并且我想手动更改变量。我使用的是Xcode 6 使用expression命令,我可以看到变量在Xcode中发生变化。我的断点位于检查myBoolValue==NO上。如果我在发出expression命令后检查myBoolValue的值,Xcode会告诉我该值为NO,但If语句的计算结果永远不正确,do neat stuff也永远不会执行 要更改变量的My LLDB表达式: exp

我正在尝试使用Xcode的LLDB控制台来更改变量。我想使用断点的调试器命令来执行此操作,这样我的程序执行就不会停止,并且我想手动更改变量。我使用的是Xcode 6

使用expression命令,我可以看到变量在Xcode中发生变化。我的断点位于检查myBoolValue==NO上。如果我在发出expression命令后检查myBoolValue的值,Xcode会告诉我该值为NO,但If语句的计算结果永远不正确,do neat stuff也永远不会执行

要更改变量的My LLDB表达式: expr myBoolValue=否

当我执行此命令时,lldb会回显以下内容: BOOL$0=否

我在这里遗漏了什么,为什么我看到myBoolValue发生了变化,但if语句中的代码从未执行过

编辑:如果我使用Xcode而不是LLDB expr命令更改值,则If检查仍然无法正确计算。我确信Xcode在引擎盖下发出的命令与我在lldb提示符下发出的命令相同,但奇怪的是if检查的计算结果始终不正确

编辑2:这是组装代码。我已编辑问题中的代码以匹配此程序集的代码。基本上是一样的,但是有一个NSLog语句作为我的好东西


你能分享一下你停在哪里吗

我怀疑行表在这里很有趣,它告诉LLDB行X的停止位置在CMP myBoolValue、NO和JNEQ otherNotNeatPlace之间。如果是这样的话,那么是的,在检查myBoolValue之后更改它不会有任何区别

也就是说,除非您试图设置非常简单的数值,否则不要尝试从Xcode UI更改值。这是一个已知的限制,当前,除非您试图将数值写回一个数值为某个数值的变量,否则编辑该值将不会真正起作用


编辑:是的,我的评论站得住脚。您正在将寄存器值与0进行比较。在myBoolValue从堆栈加载到寄存器后,您将被停止。然而,myBoolValue的位置仍然应该是其堆栈位置。这意味着您的编辑将在堆栈上进行,但对于更改寄存器来说为时已晚。因此产生了结果。

您的文件是否可能经过优化编译?通常,如果存在任何优化,堆栈上可能存在局部变量,并且正在操作的副本位于寄存器中。调试信息只会告诉lldb这些副本中的一个副本(通常是正在操作的寄存器中的副本),因此lldb可能正在修改寄存器版本,但比较是从堆栈内存中进行的

我只是猜测,但这种情况可能会导致你看到的行为。正如Enrico所建议的,这个函数的反汇编将澄清正在发生的事情。此外,当你停在感兴趣的地方时

(lldb) image lookup -va $pc
将根据调试信息中的信息显示lldb认为所有变量当前存储的位置。我们可能处于Enrico建议的指令边界,或者我们可能有变量值的多个副本,调试信息只告诉我们其中一个


通常构建at-O0时,无优化可避免此类问题。当有疑问时,阅读原始拆解说明总是有助于了解实际情况。

谢谢您的评论。我应该在我原来的问题中提到这一点。我的调试版本的优化设置为“无”。谢谢您的评论。我已经编辑了我的原始问题以发布大会。我还对代码做了一些调整,将get-neat-stuff方法更改为对NSUserDefaults的调用,并将代码主体更改为一个NSLog语句。看起来您可能会在这两个位置中的任何一个Ltmp1:cmp r1,0抱歉,我误解了您的要求。我更新了这个问题,用程序集的屏幕截图显示程序在哪里暂停