2014-07-16 113 views
33

如何在LLDB的Swift應用程序中繪製變量的值?po LLDB with swift

早些時候就好像po variable_name

現在,我通常會得到一些討厭的錯誤,如:

(lldb) po a 
error: <EXPR>:11:5: error: use of unresolved identifier '$__lldb_injected_self' 
    $__lldb_injected_self.$__lldb_wrapped_expr_2(  
    ^
+3

沒錯,斯威夫特調試是'println'目前依賴。 – Jack

+0

我有一個類似的調試錯誤,只有當試圖檢查'let'常量;看到我的問題[這裏](http://stackoverflow.com/questions/26189424/how-to-view-value-of-swift-let-constant-in-xcode-6-debugger) - 原來是成爲Xcode 6中的一個bug。 –

+0

似乎有一個代碼示例/項目出現了這些問題,需要編譯團隊的人員來訪問:https://devforums.apple.com/message/1106278#1106278。任何對這個原因的貢獻肯定會得到所有人的讚賞(並且肯定會成爲一個快樂的好人) –

回答

16

該錯誤聽起來像它可能是因爲矮是不會告訴LLDB在哪裏可以找到你的「自我」目的。鑑於Swift的性質,LLDB需要知道自我類型以便能夠在本地範圍內注入表達式 找出問題的一種方法是在LLDB提示符下執行:

(LLDB)框架變量-L自

你可能會看不到的位置吧。值得提交錯誤報告,只是爲了跟蹤您的具體情況攝製

不管怎樣,去你的大部分問題。在Swift中,沒有像ObjC那樣的「打印描述」的語言認可機制,所以雖然可以鍵入「po self」,除非self是Objective-C類型,但您幾乎可以看到「p self 「甚至」框架變量自我「會告訴你 - 完全基於LLDB數據格式化機制。如果你要掛鉤到該自定義您的斯威夫特對象的方式看,強制性的基準是:http://lldb.llvm.org/varformats.html

+4

令人討厭的是,最終的Xcode 6已經發布,並且他們無法實現在調試過程中觀察任何變量值的基本功能。 –

+0

@enrico:獲得Swift符號的藝術現狀是什麼 - 預計po會在純粹的swift物體上起作用嗎?是否有獲取數據的不同方法,並且是否需要特殊的構建設置?謝謝! –

+0

「框架變量」與對象的打印描述沒有相同的結果。它打印幾乎無用的垃圾。 – poGUIst

1

我可以證實了同樣的錯誤,對於Xcode的BETA4和 框架變量-L自

顯示的東西,但似乎最糟糕的:

:(SwiftCollectionViewSample.DetailViewController)自我=

我會明確地提出了錯誤,恩里科

17819707 debugg呃打印錯誤:使用未解決的標識符「$ __ lldb_injected_self」

+0

我得到了與XCode6 beta4相同的錯誤 –

1

我已經做了一些測試,以弄清楚它是如何工作與斯威夫特的,結果讓我吃驚了一下。通過ObjC對象po調用debugDescription,默認情況下調用description。這很清楚。不幸的是,在使用Swift類時不適用。我專注於對象而不是打印單個變量。

要使其工作(在lldbpo命令),我不得不重寫描述。下面的代碼我用來測試:

class Test : NSObject 
{ 
    var name : String? 
    var surname : String? 

    override var debugDescription : String{ 
     return "debugDescription method" 
    } 

    override var description : String { 
     return "description Method" 
    } 
} 

測試:

let test = Test() 
test.name = "name" 
test.surname = "surname" 

(lldb) po test 
description Method 

(lldb) p test 
(DebugTest.Test) $R1 = 0x00007fce11404860 { 
    ObjectiveC.NSObject = { 
    isa = DebugTest.Test 
    } 
    name = "name" 
    surname = "surname" 
} 

(lldb) po dump(test) 
▿ DebugTest.Test #0 
    - super: debugDescription method 
    ▿ name: name 
    - Some: name 
    ▿ surname: surname 
    - Some: surname 
description Method 

(lldb) po print(test) 
description Method 

令我驚訝的是,po上斯威夫特對象調用description而不是debugDescription從ObjC不同的事情。

編輯

爲了使其作用就像ObjC,你的類必須實現CustomDebugStringConvertible然後po將調用debugDescription,默認情況下調用description。這在我的例子被唯一改變的將被添加:

class Test : NSObject, CustomDebugStringConvertible 

Reference

經過與XCode 7.0.1iOS SDK 9Swift 2.0