2014-10-09 87 views
1

我正在尝试使用Xcode的LLDB控制台来更改变量。我想使用断点的调试器命令来做到这一点,所以我的程序执行永远不会停止,我想手动更改变量。我正在使用Xcode 6.LLDB expr命令不改变变量

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

enter image description here

我LLDB表达改变变量: EXPR myBoolValue = NO;

当我执行这个命令,LLDB呼应如下: (BOOL)$ 0 = NO

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

编辑:如果我使用Xcode更改值(不使用LLDB expr命令),if-check仍不能正确评估。我确信Xcode在发布的lldb提示符下发布了相同的命令,但if-check从未正确评估过程仍然很奇怪。

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

enter image description here

回答

0

你能分享你停在那里的拆卸?

我怀疑这里的表格很有趣,告诉LLDB X行的位置在CMP myBoolValue,NO和JNEQ otherNotNeatPlace之间。如果是这种情况,那么是的,在检查之后更改myBoolValue并不会产生任何影响

即便如此,也不要尝试更改Xcode UI中的值,除非您尝试设置非常小的值数值。这是一个已知的限制,目前除非您试图将数值写回到其值为“数字”的变量,否则编辑该值不会真正起作用。

编辑:是的,我的评论的立场。您正在比较寄存器值到#0。在将myBoolValue从堆栈加载到寄存器后,您将停止。但是,myBoolValue的位置仍然应该是其堆栈位置。这意味着您的编辑将会在堆栈中进行,但对于该更改来改变寄存器已经太迟了。因此,结果。

+0

感谢您的评论。我编辑了我的原始问题以发布程序集。我还对代码做了一些小调整,将get neat stuff方法改为调用NSUserDefaults,并将代码体改为NSLog语句。 – Baxpin 2014-10-13 15:09:17

+0

我希望看到的一件事就是您停下的位置的小符号“>”。它看起来像你会在这两种斑点 Ltmp1的: CMP R1,#0 < - 这里 BNE LBB0_2 < - 或HERE 一两件事,我看到的是有趣的,但..你比较“R1 “到#0。你可以做 (LLDB)框架VAR -L - myBoolValue 如果我们被告知(通过调试信息),其myBoolValue是在栈上的某个地方(在调试可能建立),我们肯定会改变堆栈上的价值,但我们不知道要更改“r1”中的值,因此即使编辑了“myBoolValue”,其在r1中的副本也不会受到影响 – 2014-10-13 17:45:03

+0

对不起,我误解了您所要求的内容。我已经更新了这个问题,以显示程序停止在程序集的屏幕截图 – Baxpin 2014-10-21 16:58:45

0

是否有可能您的文件是通过优化编译的?通常,如果有任何优化,堆栈中可能存在本地变量,正在运行的副本位于寄存器中。调试信息只会告诉lldb关于这些副本中的一个 - 通常是现在正在运行的寄存器中的一个 - 因此lldb可能会修改寄存器版本,但是比较是从堆栈内存中完成的。

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

(lldb) image lookup -va $pc 

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

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

+0

感谢您的评论。我应该在我原来的问题中提到这一点。我的调试版本优化设置为无。 – Baxpin 2014-10-13 15:06:37