【问题标题】:Is it possible to set watchpoints on Swift properties?是否可以在 Swift 属性上设置观察点?
【发布时间】:2015-03-21 23:23:57
【问题描述】:

在 Objective-C 中,我有时会在 LLDB 中设置观察点,以便让我知道实例变量何时发生变化。我也可以使用 Swift 属性来做到这一点吗?

目前,我能做到这一点的唯一方法是:

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

我还有其他选择吗?

【问题讨论】:

    标签: ios xcode swift lldb watchpoint


    【解决方案1】:

    答案比我想象的要简单得多。最简单的方法是简单地在属性声明上添加一个断点。每当读取或写入属性时,调试器都会中断。

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

    一切就绪。只有当该属性被修改时,调试器才会中断。

    【讨论】:

      【解决方案2】:

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

      默认情况下全部选中,然后您可以禁用不需要的那些。 注意:我发现当您第一次添加断点时,它不会在您运行应用程序之前展开。

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

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

      break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 2015-03-21
        相关资源
        最近更新 更多