使用Swift时如何在lldb中设置符号断点?例如,有时我使用:
(lldb) b set -F '-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded]'
Run Code Online (Sandbox Code Playgroud)
但这不再起作用:
断点2:无位置(待定)。警告:无法将断点解析到任何实际位置。
我也尝试过
(lldb) b set -F 'UIView.updateConstraintsIfNeeded()'
(lldb) b set -F 'UIView.updateConstraintsIfNeeded'
Run Code Online (Sandbox Code Playgroud)
但是没有爱。我想这个问题归结为使用Swift时lldb认为“完全限定的函数名”是什么。文档说:
-F(--fullname)
通过完全限定的函数名称设置断点。对于C ++,这意味着名称空间和所有参数,对于Objective C,这意味着具有类和选择器的完整函数原型。可以重复多次以为多个名称创建一个断点。
斯威夫特呢?
当lldb设置断点时,任何更高级的匹配断点(包括-F)都需要知道目标语言,因为它所匹配的种类取决于此。默认情况下,lldb选择当前框架的语言,但是您可以覆盖它。因此,例如,当您在Swift帧中停止时要中断ObjC符号,请执行以下操作:
(lldb) break set -F '-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded]' -L objc
Breakpoint 3: where = UIKit`-[UIView(AdditionalLayoutSupport) updateConstraintsIfNeeded], address = 0x0000000100963acc
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用-nbreak选项,该选项不会尝试理解它匹配的符号,而只是在符号名称中广泛搜索该字符串。
请注意,在这种情况下,您需要断开ObjC符号,而不是它在Swift中的显示方式,因为swift一侧实际上只是objc的一个垫片,并且实际上没有钩住的swift一侧符号。