是否可以在Swift属性上设置观察点?

Bil*_*ill 17 xcode watchpoint ios lldb swift

在Objective-C中,我有时会在LLDB中设置观察点,以便在实例变量发生变化时通知我.我也可以使用Swift属性吗?

现在,我能做到这一点的唯一方法是:

  • 将didSet处理程序添加到属性并在其中设置断点(但这需要停止程序并重新编译,这样会破坏目的)
  • 添加一个符号断点[setPropertyName:]但这仅在该类恰好支持Objective-C桥接时才有效

我还有其他选择吗?

Bil*_*ill 25

答案比我想象的要简单得多.最简单的方法是在属性声明中添加断点.只要读取或写入属性,调试器就会中断.

如果像我一样,只想在属性更改时忽略并忽略提取,请在属性声明中设置断点,然后进入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 
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个主断点"1",有三个子断点.禁用getter的子断点:

(lldb) br disable 1.1
1 breakpoints disabled.
Run Code Online (Sandbox Code Playgroud)

你们都准备好了.只有在修改了该属性时,调试器才会中断.

  • ...我是OP? (5认同)

Vla*_*lad 5

在XCode(8.2 Swift 3.0)上,通常在swift属性上设置断点然后运行你的应用程序.应用程序运行后转到断点面板,您可以将断点扩展为多个断点:

在此输入图像描述

默认情况下会选中所有项,然后您可以禁用不需要的项.注意:我发现当您第一次添加断点时,它将不会扩展,直到您运行该应用程序.

您可以尝试的另一种方法是使用lldb添加它们.首先在类实例中的某处添加断点,例如viewDidLoad ext.p self并记下实例的内存地址.

然后像这样添加断点,其中0x0f0f0f0f0f0f是类的内存地址.

break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f'
Run Code Online (Sandbox Code Playgroud)