用Swift和lldb设置符号断点

问题描述:

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

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

但这不再起作用:

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

我也试过

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

但没有爱。我想这个问题归结于当使用Swift时lldb认为“完全限定的函数名称”。该文件说:

-F(--fullname)

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

斯威夫特呢?

当lldb设置任何匹配断点(包括-F)的断点时,它需要知道目标语言,因为匹配类型取决于它。默认情况下,lldb选择当前帧的语言,但可以覆盖它。因此,例如对当你停在斯威夫特框架的ObjC符号突破,做到:

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

或者你可以使用-n break选项,不试着去了解它匹配的符号,只是在符号名称中对该字符串进行广泛的搜索。

请注意,在这种情况下,您需要打破ObjC符号,而不是它在Swift中出现的方式,因为快捷方式实际上仅仅是objc中的一个垫片,并且没有真正的快捷方式符号来挂接到。

+0

你回答了我的问题。谢谢!那么是不是可以使用Xcode的“添加符号断点”UI(而不是从lldb命令行)设置等同的断点?也就是说,在不知道Swift-mangled符号名称的情况下...... –

+0

Xcode的符号断点相当于break -n。这往往是一个非常松散的名称匹配,所以“断点语言”并不重要(尽管如果你想做Foo :: Bar vrs。Swift的Foo.Bar语言将会很重要。)'-n的主要问题'断点是他们投了一个太宽的网。但Xcode UI还允许您指定共享库进行搜索,这可以稍微降低噪音。 –