【问题标题】:Setting a symbolic breakpoint with Swift and lldb使用 Swift 和 lldb 设置符号断点
【发布时间】:2017-02-12 23:12:06
【问题描述】:

使用 Swift 时如何在 lldb 中设置符号断点?例如,有时我会使用:

(lldb) b set -F '-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded]'

但这不再有效:

断点 2:没有位置(待定)。警告:无法解决 任何实际位置的断点。

我也试过

(lldb) b set -F 'UIView.updateConstraintsIfNeeded()'
(lldb) b set -F 'UIView.updateConstraintsIfNeeded'

但没有爱。我想问题归结为 lldb 在使用 Swift 时认为“完全限定的函数名”。文档说:

-F ( --fullname )

通过完全限定的函数名设置断点。对于 C++ 这个 表示命名空间和所有参数,对于 Objective C 这意味着 带有类和选择器的完整功能原型。可以重复 多次为多个名称创建一个断点。

斯威夫特呢?

【问题讨论】:

    标签: swift lldb


    【解决方案1】:

    当 lldb 设置断点时,任何更高级的匹配断点(包括 -F),它都需要知道目标语言,因为它所做的匹配类型取决于此。默认情况下,lldb 选择当前框架的语言,但您可以覆盖它。因此,例如,当您在 Swift 框架中停止时,要在 ObjC 符号上中断,请执行以下操作:

    (lldb) break set -F '-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded]' -L objc
    Breakpoint 3: where = UIKit`-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded], address = 0x0000000100963acc
    

    或者您可以使用-n break 选项,它不会尝试理解它匹配的符号,而只是在符号名称中广泛搜索该字符串。

    注意,在这种情况下,您需要中断 ObjC 符号,而不是它在 Swift 中的显示方式,因为 swift 端实际上只是 objc 中的一个垫片,并没有真正可以挂钩的 swift 端符号。

    【讨论】:

    • 你回答了我的问题。谢谢!那么是不是不可能使用 Xcode 的“添加符号断点”UI(而不是从 lldb 命令行)设置等效断点?也就是说,在不知道 Swift 损坏的符号名称的情况下……
    • Xcode 的符号断点相当于break set -n。这往往是一个更松散的名称匹配,因此“断点语言”并不那么重要(尽管如果你想做 Foo::Bar vrs. Swift 的 Foo.Bar 语言会很重要。)-n 的主要问题断点是他们撒的网太宽了。但是 Xcode UI 还允许您指定要搜索的共享库,这可以在一定程度上减少噪音。
    【解决方案2】:

    在 lldb 控制台中,您可以提供部分名称并使用正则表达式进行自动查找:

    br set -r updateConstraintsIfNeeded\]
    

    结果是:

    Breakpoint 4: where = UIKit`-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded]
    

    在当前版本的 Xcode 中,您还可以在“添加符号断点”UI 中使用部分名称,因为现在有代码完成功能可以帮助您。

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2018-04-27
      • 2021-05-27
      • 2021-11-19
      • 2019-12-18
      相关资源
      最近更新 更多