- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想跟踪 self.view 的大小何时发生变化。正确的格式是什么?
(lldb) po self.view
(UIView *) $1 = 0x0a8aba20 <UIView: 0xa8aba20; frame = (0 0; 480 864); autoresize = W+TM+BM; layer = <CALayer: 0xa8aba50>>
(lldb) watch set variable self.view.frame.size.width
error: "self" is a pointer and . was used to attempt to access "view". Did you mean "self->view.frame.size.width"?
(lldb) watch set variable self->view
error: "view" is not a member of "(PlayViewController *) self"
(lldb) watch set variable self->view.frame.size.width
error: "view" is not a member of "(PlayViewController *) self"
我已经尝试了文档和其他 lldb 观察点问题,但找不到针对此特定案例的任何内容。
感谢您的帮助。
最佳答案
View Controller 从它的 _view
实例变量引用它的 View 。
View 不直接存储它的框架。它只是返回其图层的“框架”。
View 从它的 _layer
实例变量引用它的层。
图层也不存储帧。它根据其 bounds
、position
、anchorPoint
和 transform
计算其框架。大小是 bounds
的一部分。
图层不直接将其边界存储在实例变量中。相反,它的 layer
实例变量引用私有(private) C++ 类 CA::Layer
的实例。此类的成员布局未记录。
换句话说,你可以去 self->_view->_layer->layer
去到 CA::Layer
实例,但是你会卡住因为您不知道在 CA::Layer
的哪个位置可以找到边界。
因此,尝试使用观察点来检测 View 大小的变化是相当困难的。
在-[CALayer setBounds:]
上打断点更容易。
请记住在断点条件中使用层地址,而不是 View 地址。
(lldb) po self.view
(UIView *) $1 = 0x0a034690 <UIView: 0xa034690; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0xa034780>>
(lldb) break set -F '-[CALayer setBounds:]' -c '((int*)$esp)[1] == 0xa034780'
Breakpoint created: 2: name = '-[CALayer setBounds:]', locations = 1, resolved = 1
当命中断点时,CALayer
实例被((int *)$esp)[1]
引用,新的边界是* (CGRect *)($esp+12)
:
(lldb) po ((int*)$esp)[1]
(int) $8 = 167987072 <CALayer:0xa034780; position = CGPoint (384 480); bounds = CGRect (0 0; 768 1004); delegate = <UIView: 0xa034690; frame = (0 -22; 768 1004); autoresize = W+H; layer = <CALayer: 0xa034780>>; sublayers = (<CALayer: 0xa033010>); backgroundColor = <CGColor 0xa034960> [<CGColorSpace 0xa02b3b0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
(lldb) p *(CGRect*)($esp+12)
(CGRect) $9 = origin=(x=0, y=0) size=(width=768, height=960)
(lldb) finish
(lldb) po 0xa034780
(int) $10 = 167987072 <CALayer:0xa034780; position = CGPoint (384 480); bounds = CGRect (0 0; 768 960); delegate = <UIView: 0xa034690; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0xa034780>>; sublayers = (<CALayer: 0xa033010>); backgroundColor = <CGColor 0xa034960> [<CGColorSpace 0xa02b3b0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
请记住在断点条件中使用层地址,而不是 View 地址。
(lldb) po self.view
(UIView *) $0 = 0x1f031a10 <UIView: 0x1f031a10; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x1f031b00>>
(lldb) break set -F '-[CALayer setBounds:]' -c '$r0 == 0x1f031b00'
Breakpoint created: 2: name = '-[CALayer setBounds:]', locations = 1, resolved = 1
当命中断点时,CALayer
实例被$r0
引用,新的X原点在$r2
,新的Y 原点在 $r3
,新尺寸为 *(CGSize *)$sp
:
(lldb) po $r0
(unsigned int) $7 = 520297216 <CALayer:0x1f031b00; position = CGPoint (384 480); bounds = CGRect (0 0; 768 1004); delegate = <UIView: 0x1f031a10; frame = (0 -22; 768 1004); autoresize = W+H; layer = <CALayer: 0x1f031b00>>; sublayers = (<CALayer: 0x1f030840>); backgroundColor = <CGColor 0x1f031ce0> [<CGColorSpace 0x1e530ad0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
(lldb) p/f $r2
(unsigned int) $14 = 0
(lldb) p/f $r3
(unsigned int) $15 = 0
(lldb) p *(CGSize *)$sp
(CGSize) $16 = (width=768, height=960)
(lldb) finish
(lldb) po 0x1f031b00
(int) $17 = 520297216 <CALayer:0x1f031b00; position = CGPoint (384 480); bounds = CGRect (0 0; 768 960); delegate = <UIView: 0x1f031a10; frame = (0 0; 768 960); autoresize = W+H; layer = <CALayer: 0x1f031b00>>; sublayers = (<CALayer: 0x1f030840>); backgroundColor = <CGColor 0x1f031ce0> [<CGColorSpace 0x1e530ad0> (kCGColorSpaceDeviceRGB)] ( 1 1 1 1 )>
关于iphone - 如何在 self.view 的属性上设置 lldb 观察点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13976219/
我正在尝试使用 lldb 远程启动和调试新进程没有太大的成功。 通过运行以下命令附加到已启动的进程效果很好: process connect process attach -P gdb-remote
如果我针对给定主题调用 lldb 帮助,大部分内容都会从屏幕上消失。例子: (lldb) help expression 我可以退出调试器,并在 typescript 中收集帮助,但这很笨拙。 lld
在 lldb 中有没有办法继续直到循环结束?我正在寻找 finish 的类似物,但它不是跳出堆栈帧,而是跳出循环。 for (int i = 0; i < 10000000; i++) { .
我已阅读 this tutorial ,但我还没有发现任何有关反向调试的信息。 lldb 是否有一些功能,例如 target record在 gdb 中?如果是,我在哪里可以阅读它? 最佳答案 还没有
lldb 是否具有 gdb 的等效项 shell命令从提示符运行外部命令? (见 How can I execute external commands from the gdb command pr
LLDB 有 convenience variables ?如果是这样,我该如何使用它们?如果没有,我可以使用类似的东西吗? 引用:http://software.intel.com/sites/pr
有没有办法使用 lldb 调试器设置零标志? 类似 gdb 中的 set ($eflags)=似乎只有 register write rflags ... 来设置所有 最佳答案 这是在 lldb 中设
有没有办法使用 lldb 调试器设置零标志? 类似 gdb 中的 set ($eflags)=似乎只有 register write rflags ... 来设置所有 最佳答案 这是在 lldb 中设
我正在使用 lldb 来跟踪调用 CoreFoundation 函数(例如 CFRunLoopTimerCreate)的一些纯 C 或 C++ 代码(32 位)。 我在 CFRunLoopTimerC
我在 lldb 中为我在 MacOS 上安装的基于 C 语言的应用程序设置了很多断点。断点大多设置在应用程序的同一函数中。然而,第二天我回到应用程序继续工作,我又开始在同一个函数中设置断点,出现了一个
您最喜欢的打印 NSArray 内容的方式是什么?使用LLDB? 一个python脚本? 内联 for 循环? 一个Objective-C 方法调用? 我知道按索引打印对象很容易。我想一次打印所有对象
我想从脚本中运行类似以下命令的内容: lldb -f /path/to/my/file -o command1 -o command2 ... -o detach 有没有办法在执行后退出lldb而不进
众所周知,我们可以在 GDB 中使用命令“catch syscall”来中断每个系统函数。 LLDB 中是否有类似的命令? (gdb) catch syscall Catchpoint 1 (sysc
使用 Xcode 10,当我使用断点停止我的应用程序并尝试在控制台中打印对象的内容时,我获得: "Couldn't IRGen expression, no additional error" 但是,
由于这些天在 Mac 上使用 gdb 变得越来越困难(至少我觉得我正在与 Apple 进行艰苦的斗争),所以我开始尝试使用 lldb。 是否有与 gdb -tui 等效的模式,可以显示源代码的良好、持
使用 Xcode 10,当我使用断点停止我的应用程序并尝试在控制台中打印对象的内容时,我得到: "Couldn't IRGen expression, no additional error" 但是,
$cat testleak01.cpp #include int main() { int*p=new int[3]; return 0; } 用调试信息编译它 $g++ testle
如何检查LLDB中不同线程中运行和步进的线程数? GDB 有信息线程。 LLDB 有类似的命令吗? 最佳答案 跑过: (lldb) help thread 命令来看看你可以用 lldb 中的线程做什么
我正在运行 Xubuntu 16.04。从存储库安装 lldb 后,当我尝试使用它时,我得到以下输出: lldb foo (lldb) target create "foo" Current exec
我目前正在为 C++ 中的自定义对象开发绘图命令。我正在使用 Xcode v10.1。 我使用command script import test.py 导入我自己的命令,其中有一个函数如下: imp
我是一名优秀的程序员,十分优秀!