在x86_64 lldb中调试UIView(几何)setFrame

时间:2016-06-06 02:22:18

标签: xcode debugging lldb

带有符号断点 - [UIView(Geometry)setFrame:] 并且lldb在符号断点处停止我输入了frame variable命令以不产生任何东西......真的没什么。

我尝试过的事情。 打开和关闭优化。 不同的拱64和32 enter image description here

此代码在断点之前运行

let rect =  CGRect(x: 0, y: 0, width: 320, height: 1230)
view.frame = rect

我真正想要的是在64位时调试CGRect参数,而 在32位*(CGRect *)($esp + 12)工作正常,但在64 *(CGRect *)$rdx/rcx错误:无法应用表达式副作用:无法取消物化结果变量:无法读取其内存

所以在我碰到一堵墙之后我想看看框架变量导致我发现这个结果。如果有人知道如何调试值

另外值得注意的是,因为$ rdx➡arg2他们应该得到相同的结果,但他们不会

arg2打印出一个CGRect,但它有错误的值

但$ rdx会抛出错误

(lldb) po *(CGRect*)$arg2 (origin = (x = 3.8098582624090393E+180, y = 3.6806986858704324E+180), size = (width = 4.9279512391228864E+180, height = 1.469851705066036E-307)) (origin = (x = 3.8098582624090393E+180, y = 3.6806986858704324E+180), size = (width = 4.9279512391228864E+180, height = 1.469851705066036E-307)) (lldb) p *(CGRect*)$rdx error: Couldn't apply expression side effects : Couldn't dematerialize a result variable: couldn't read its memory

1 个答案:

答案 0 :(得分:0)

x86_64(link_to "test", "#", :onclick=>"call_js_function(); return false;", :data=>{:confirm=>"are you sure?"} )上函数的第一个参数在$arg1中传递。 x86_64(rdi)上函数的第二个参数在$arg2中传递。第三个arg是rsi。我怀疑当你将它作为一个值传递给rdx时,你看到的问题的根源。

p(简称frame variable)仅显示带有调试信息的变量。您在没有调试信息的普通汇编函数中停止。在第一个pc值,第一个参数位于fr v,第二个参数位于`rsi等,而lldb可能会将这些显示为“变量” - 但只要您单步执行该函数,这些寄存器就可以被重用于其他值(例如,如果调用另一个函数),那么说出该寄存器中的内容就不再安全了。

相关问题