LLDB expr命令不更改变量

时间:2014-10-09 20:53:35

标签: xcode lldb

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

使用表达式命令,我可以看到Xcode中的变量发生了变化。我的断点位于myBoolValue == NO的检查上。如果我在发出表达式命令后检查myBoolValue的值,Xcode告诉我值为NO,但if语句永远不会正确计算,并且“do neat stuff”永远不会被执行。

enter image description here

我的LLDB表达式更改变量:      expr myBoolValue = NO;

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

我在这里缺少什么,为什么我看到myBoolValue发生变化,但if语句中的代码永远不会被执行?

编辑:如果我使用Xcode更改值(不使用LLDB expr命令),则if-check仍然无法正确评估。我确信Xcode在lldb提示符下发出了相同的命令,但if-check永远不会正确评估,这仍然很奇怪。

编辑2:这是汇编代码。我在我的问题中编辑了代码以匹配此程序集的代码。基本上是一样的东西,但NSLog声明作为我的整洁的东西。

enter image description here

2 个答案:

答案 0 :(得分:0)

你能分享一下你被停止的地方的反汇编吗?

我怀疑线路表在这里很有趣,告诉LLDB,X线停靠的位置在CMP myBoolValue,NO和JNEQ otherNotNeatPlace之间。如果是这种情况,那么是的,在检查后更改myBoolValue会没有任何区别

话虽如此,除非您尝试设置非常简单的数值,否则不要尝试更改Xcode UI中的值。这是一个已知的限制,除非你试图将数值写回一个值为“数字”的变量,否则编辑该值将无法正常工作。

编辑:是的,我的评论代表。您将寄存器值与#0进行比较。 myBoolValue从堆栈加载到寄存器后你就停止了。但是,myBoolValue的位置仍然应该是其堆栈位置。这意味着你的编辑将进入堆栈,但改变寄存器的改变为时已晚。因此结果。

答案 1 :(得分:0)

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

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

的输出
(lldb) image lookup -va $pc

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

通常在-O0建立(没有优化)可以避免这些问题。如有疑问,阅读原始反汇编指令总是有助于了解实际情况。