为什么Xcode的Variables View的"编辑值"没有改变变量值?

Den*_*er9 7 iphone variables debugging xcode ios

在Xcode的变量视图中,在调试区域的右侧,当应用程序在断点处运行并暂停时,您可以右键单击变量并选择"编辑值".

对于一个快速的字符串,它是灰色的,我可以想象为什么会出现这种情况.但是即使对于一个简单的int,它也会弹出一个编辑框来输入一个新值,但是在点击之后它会保持旧值.即使对于在代码期间更改的var也是如此.

更新:如下面的Jim的答案所示,您应该能够使用lldb表达式命令设置值,但是,尽管Xcode会告诉您它已经更改,但它实际上无法更改值.

这有没有破坏,或者你需要做些什么来让它起作用?谢谢.

截图

更新:这是一个编译错误 - 请参阅Jim的评论.这是一个解决方法......

    println("Before lldb change, foo is \(foo)")
    //make compiler think foo may change, so I can change it myself at the console
    if count("abcd") == 0 { foo = 0 }
    println("After lldb change, code now thinks foo is \(foo)")
Run Code Online (Sandbox Code Playgroud)

Jim*_*ham 14

大多数Swift实体,确实是字符串,甚至像Int的"简单"类型,实际上并不是简单的类型.您在变量视图中看到的值是由lldb中的数据格式化程序构造的,这些格式化程序设置为在不运行任何代码的情况下呈现值的有用视图(出于性能原因.)它们知道grub如何获取和获取Swift类型的内容,但我们并没有教他们如何编辑价值观,只是展示它们.

如果要更改值,则需要在程序中运行一些代码来执行此操作,您可以使用expressionlldb控制台中的命令执行此操作.因此,例如,如果您有一个名为的Int变量foo,您可以这样做:

(lldb)expr foo = 12

这将编译并执行该代码片段,当然Swift编译器确实知道如何更改这些Swift值,因此生成的代码将正确设置该值.

注意,似乎swift编译器有时会将一个值复制到寄存器并从寄存器中使用它来指示调试信息中的事实.如果发生这种情况,lldb将报告它在调试信息指向的位置设置的值,但代码实际上将使用临时值.我已经向swift编译器提交了一个错误,演示了一个这样的实例.

  • 有趣.这是编译器中的一个错误.因为它知道foo在你设置和使用它之间没有改变,所以它将值存储在某个临时位置 - 很可能是寄存器 - 并从寄存器中访问它.这是一件好事,但它忽略了告诉调试器实时版本现在在寄存器中.你可以这样说,因为如果你创建一个带有inout Int的func,并在你设置变量和读取它之间传递foo到那个调用,那么代码路径将受到你的"set"的影响. (2认同)