gpt4 book ai didi

Swift LLDB 不改变值/没有效果

转载 作者:行者123 更新时间:2023-11-30 13:55:19 24 4
gpt4 key购买 nike

有这样的代码:

var foo: Int = 0
print (foo)

print 行处设置断点...然后执行以下操作:

(lldb) exp foo = 7
(lldb) p foo
(Int) $R2 = 7
0

print(x) 仍然返回 0 而不是 7。这怎么可能?

最佳答案

更多详细信息会有所帮助,但总的来说,我在三种情况下看到过这种情况:

1) 当你有一个let时,编译器可以自由地将let替换为其值。这不是你的情况,但为了论证,考虑到:

let x = 0
print(x)

编译器可以自由地将其重写为

print(0)

保留 let 绑定(bind)只是为了调试器。现在,let 就是let,所以写入它并不完全是一个明确定义的操作。话虽如此,C 编译器似乎并没有对 const 值采取同样的方法,因此失败模式可能会让某些人感到惊讶

2) 如果您调用函数,编译器(本质上)将发出代码将参数压入堆栈,然后跳转到该函数的代码。理论上,人们会期望调试信息中的行表引导调试器在参数被推送之前停止。然后,

>> push x
call print

对 x 的写入实际上在打印调用的上下文中“意味着”某些内容。但是,如果行表实际上让我们在调用处停止,即使您写入“x”,它也已经被推送,并且将使用旧值

3) 编译器实际上可能使用寄存器中的“foo”副本,但为了调试信息,将我们指向“foo”的堆栈副本,该副本实际上从未使用过,仅更新当写入“foo”发生时。如果是这种情况,LLDB 将很乐意写入堆栈,但这不会影响程序的行为,因为它实际上并未从堆栈中读取

尝试解决这个问题的有趣事情包括:

LLDB反汇编命令

(lldb) reg read pc
(lldb) dis -s <value of program counter>

(lldb) fr var -L foo

然后读取LLDB给出的内存地址(或寄存器)作为“foo”的位置

在您的应用中, print(x) 两次,然后查看第二次打印是否显示不同的值

关于Swift LLDB 不改变值/没有效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com