为什么Xcode的变量会查看"编辑值"不改变变量值?

时间:2015-07-12 10:56:10

标签: ios iphone xcode debugging variables

在Xcode的变量视图中,在调试区域的右侧,当应用程序在断点处运行并暂停时,您可以右键单击变量并选择&#34;编辑值&#34;。< / p>

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

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

这是否已损坏,或者您需要做些什么才能使其正常工作?感谢。

Screenshot

更新:这是一个编译错误 - 请参阅Jim's comment。这是一个解决方法......

    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)")

2 个答案:

答案 0 :(得分:14)

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

如果要更改值,则需要在程序中运行一些代码才能执行此操作,您可以使用lldb控制台中的 var list = new List<Car>(); list.AddRange(GetGreenCars()?.Except(list)); list.AddRange(GetBigCars()?.Except(list)); list.AddRange(GetSmallCars()?.Except(list)); 命令执行此操作。因此,例如,如果您有一个名为expression的Int变量,则可以执行以下操作:

(lldb)expr foo = 12

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

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

答案 1 :(得分:1)

如果是常量整数,则无法直接设置任何内容。

但是,假设您将变量作为参数传递给函数:

value = (AnyObject!) Int64(38) instance_type = (Builtin.RawPointer) 0xb000000000000263

请注意,以1开头的地址不是真正的指针。现在假设您要将值38替换为64.您键入:

po Unmanaged.passUnretained(64).toOpaque() 并且你有常量64的神奇伪地址:

0xb000000000000403 - _rawValue : (Opaque Value)

然后你用0xb000000000000403替换0xb000000000000263并且你的常数已经改变了。

上帝,我喜欢斯威夫特