2016-10-04 126 views
3

如何在使用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,這意味着 帶有類和選擇器的全功能原型。可以多次重複 以爲多個名稱創建一個斷點。

斯威夫特呢?

回答

3

當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還允許您指定共享庫進行搜索,這可以稍微降低噪音。 –