为什么Xcode的variables视图的“编辑值”不改变variables值?
在Xcode的variables视图中,在debugging区域的右侧,当应用程序正在运行并在断点处暂停时,可以右键单击variables并select“编辑值”。
对于一个快速的string是灰色的,我可以想像为什么可能是这样的。 但即使对于一个简单的int,它也会popup一个编辑框来input一个新的值,但是在这个值之后,这个值保持原来的值。 即使在代码中更改的variables也是如此。
更新:如下面Jim的答案所示,您应该可以使用lldbexpression式命令来设置值,但是尽pipeXcode会告诉您它已经改变,但是它实际上并没有改变这个值。
这是打破了,还是有什么具体的,你需要做的工作? 谢谢。
更新:这是一个编译错误 – 请参阅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)")
大多数Swift实体,对于确定的string,但即使是“简单的”types,如Int,实际上也不是简单的types。 您在variables视图中看到的值是由lldb中的数据格式化器构build的,这些数据格式化器被设置为呈现值的有用视图,而不运行任何代码(出于性能方面的原因)。他们知道如何在Swifttypes,但是我们没有教他们如何编辑价值观,只呈现它们。
如果你想改变一个值,你需要在你的程序中运行一些代码来做到这一点,你可以在lldb控制台中使用expression
命令。 例如,如果你有一个叫做foo
的Intvariables,你可以这样做:
(lldb)expr foo = 12
这将编译和执行该代码片段,当然,Swift编译器确实知道如何修改这些Swift值,所以生成的代码将正确设置值。
请注意,它看起来似乎swift编译器有时将值复制到一个寄存器,并从debugging信息中指示事实的registry中使用它。 如果发生这种情况,lldb会报告它在debugging信息指向的位置设置的值,但代码实际上会使用临时值。 我用swift编译器提出了一个bug,certificate了这个的一个实例。
在整数常量的情况下,你不能直接设置任何东西。
然而让我们假设你有一个variables作为parameter passing给你的函数:
value = (AnyObject!) Int64(38) instance_type = (Builtin.RawPointer) 0xb000000000000263
请注意,从1开始的这个地址不是一个真正的指针。 现在让我们假设你想用64replace值38。
po Unmanaged.passUnretained(64).toOpaque()
你有一个神奇的常量64的伪地址:
0xb000000000000403 - _rawValue : (Opaque Value)
那么你用0xb000000000000403代替0xb000000000000263,你有你的不断变化。
上帝,我爱Swift