是否有可能在Swift属性上设置观察点?
在Objective-C中,我有时会在LLDB中设置观察点,让我知道实例variables何时发生变化。 我可以用Swift属性来做这个吗?
现在,我能做到的唯一方法是:
- 在属性中添加一个didSet处理程序并在其中设置一个断点(但是这需要停止程序并重新编译,这种方式会使目标失败)
- 在
[setPropertyName:]
上添加一个符号断点,但这只有在类正好支持Objective-C桥接
我有其他的select吗?
答案比我想像的要简单得多。 最简单的方法是简单地在属性声明中添加一个断点。 只要属性被读取或写入,debugging器就会中断。
如果像我一样,只有在属性发生变化时才会中断,并忽略提取,请在属性声明中设置断点,然后进入LLDB控制台并键入“br list”以查看所有断点的列表:
(lldb) br list Current breakpoints: 1: file = '/Users/testuser/Desktop/TestFoo/Test.swift', line = 12, locations = 3, resolved = 3, hit count = 1 1.1: where = TestFoo`TestFoo.Test.x.getter : Swift.Int + 12 at Test.swift:12, address = 0x00000001084cfefc, resolved, hit count = 1 1.2: where = TestFoo`TestFoo.Test.x.setter : Swift.Int + 16 at Test.swift:12, address = 0x00000001084cff80, resolved, hit count = 0 1.3: where = TestFoo`TestFoo.Test.x.materializeForSet : Swift.Int + 16 at Test.swift:12, address = 0x00000001084d00f0, resolved, hit count = 0
正如你所看到的,有三个子断点的主断点“1”。 禁用getter的子断点:
(lldb) br disable 1.1 1 breakpoints disabled.
你们都定了 只有当该属性被修改时,debugging器才会中断。
在XCode(8.2 Swift 3.0)通常在swift属性上设置断点,然后运行你的应用程序。 在应用程序运行到断点面板后,您可以将断点展开为多个断点:
所有的都是默认选中的,然后你可以禁用那些你不需要的。 注:我发现,当你第一次添加断点,它不会扩大,直到你运行的应用程序。
另一种可以尝试的方法是使用lldb来添加它们。 首先添加断点在你的类实例内,例如viewDidLoad ext。 p自己并记下你的实例的内存地址。
然后像这样添加断点,其中0x0f0f0f0f0f0f是类的内存地址。
break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f'