使用Swift和lldb设置符号断点

12

当使用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呢?

2个回答

8

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

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

或者你可以使用-n中断选项,它不尝试理解匹配的符号,而是在符号名称中进行广泛搜索。

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


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

2
在lldb控制台中,您可以输入部分名称并使用正则表达式进行自动查找:
br set -r updateConstraintsIfNeeded\]

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

在当前版本的Xcode中,“添加符号断点”界面上也可以使用部分名称,因为现在有代码自动完成来帮助您。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接