【问题标题】:LLDB expr command not changing variableLLDB expr 命令不改变变量
【发布时间】:2014-10-09 20:53:34
【问题描述】:

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

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

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

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

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

编辑:如果我使用 Xcode(不使用 LLDB expr 命令)更改值,if-check 仍然无法正确评估。我确信 Xcode 在后台发出的命令与我从 lldb 提示符发出的命令相同,但 if-check 从未正确评估仍然很奇怪。

编辑 2:这是汇编代码。我已编辑问题中的代码以匹配此程序集的代码。基本上是一样的,但我的整洁的东西是 NSLog 语句。

【问题讨论】:

    标签: xcode lldb


    【解决方案1】:

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

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

    (lldb) image lookup -va $pc
    

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

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

    【讨论】:

    • 感谢您的评论。我应该在我原来的问题中提到这一点。我的调试版本的优化设置为无。
    【解决方案2】:

    你能分享一下你停止的地方吗?

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

    话虽如此,除非您尝试设置非常微不足道的数值,否则不要尝试从 Xcode UI 更改值。这是一个已知的限制,目前除非您尝试将数值写回其值有点“数字”的变量,否则编辑该值不会真正起作用。

    编辑:是的,我的意见成立。您正在将寄存器值与#0 进行比较。在 myBoolValue 从堆栈加载到寄存器后,您将停止。但是,myBoolValue 的位置仍然应该是其堆栈位置。这意味着您的编辑将进入堆栈,但该更改更改寄存器为时已晚。结果就是这样。

    【讨论】:

    • 感谢您的评论。我已经编辑了我的原始问题以发布程序集。我还对代码进行了细微的调整,将 get quiet stuff 方法更改为对 NSUserDefaults 的调用,并将代码主体更改为 NSLog 语句。
    • 我希望看到的一件事是您停留位置的小“>”符号。看起来你会在这两个位置 Ltmp1 中的任何一个: cmp r1, #0
    • 对不起,我误解了你的要求。我已经更新了问题,以显示程序在哪里停止并通过程序集的屏幕截图
    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2019-02-07
    • 2020-06-25
    • 2015-09-28
    • 1970-01-01
    • 2016-07-27
    • 2013-06-11
    • 2021-02-06
    相关资源
    最近更新 更多