用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中的一个垫片,并且没有真正的快捷方式符号来挂接到。
你回答了我的问题。谢谢!那么是不是可以使用Xcode的“添加符号断点”UI(而不是从lldb命令行)设置等同的断点?也就是说,在不知道Swift-mangled符号名称的情况下...... –
Xcode的符号断点相当于break -n。这往往是一个非常松散的名称匹配,所以“断点语言”并不重要(尽管如果你想做Foo :: Bar vrs。Swift的Foo.Bar语言将会很重要。)'-n的主要问题'断点是他们投了一个太宽的网。但Xcode UI还允许您指定共享库进行搜索,这可以稍微降低噪音。 –