使用Swift和lldb设置符号断点

时间:2016-10-04 17:16:38

标签: swift lldb

使用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 个答案:

答案 0 :(得分: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中断选项,它不会尝试理解它匹配的符号,只是在符号名称中对该字符串进行广泛搜索。

注意,在这种情况下,你需要打破ObjC符号,而不是它在Swift中出现的方式,因为快速的一侧实际上只是一个垫片,它并不是一个快速的侧面符号来钩住到。

答案 1 :(得分:1)

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

br set -r updateConstraintsIfNeeded\]

结果是:

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

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

enter image description here