首页 文章

使用Swift和lldb设置符号断点

提问于
浏览
4

在使用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,这意味着具有类和选择器的完整函数原型 . 可以重复多次,为多个名称创建一个断点 .

斯威夫特怎么样?

2 回答

  • 4

    当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中出现的方式,因为快速的一侧实际上只是一个垫片进入objc,并没有真正的快速侧符号可以挂钩 .

  • 1

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

    br set -r updateConstraintsIfNeeded\]
    

    结果是:

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

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

    enter image description here

相关问题