2015-04-04 38 views
33

是否有可以將原始地址轉換爲可用Swift類的LLDB命令?LLDB(Swift):將原始地址轉換爲可用類型

例如:

(lldb) po 0x7df67c50 as MKPinAnnotationView 

我知道這個地址指向一個MKPinAnnotationView,但它不是我能選擇的框架。但是,我想將原始地址轉換爲MKPinAnnotationView,以便我可以檢查其屬性。這可能嗎?

回答

34

在xcode中8.2.1和夫特3,LLDB命令POp不會與類型的變量工作。您將需要使用快速命令print來檢查類型對象實例的屬性。 (感謝cbowns's answer!)例如: -

(lldb) expr -l Swift -- import UIKit 
(lldb) expr -l Swift -- let $pin = unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self) 
(lldb) expr -l Swift -- print($pin.alpha) 
+2

這真的不應該這麼難 – 2017-11-07 22:24:18

+0

這是一個有點直觀。我以爲我不需要在控制檯中輸入'(lldb)'。但沒有這個,它就無法工作。 – Honey 2017-12-13 16:53:09

30

您可以使用雨燕的unsafeBitCast函數的地址轉換爲一個對象實例:

(lldb) e let $pin = unsafeBitCast(0x7df67c50, MKPinAnnotationView.self) 
(lldb) po $pin 

然後你就可以用$pin照常上班 - 訪問屬性,調用方法等

看看這個文章的更多信息:Swift Memory Dumping

+0

對於第一個發言,我認爲你忘了「expr的」或「表達」。否則,它工作得很好! – jarrodparkes 2015-04-04 04:13:01

+0

謝謝......修正! – gregheo 2015-04-04 04:14:36

+2

在Xcode 7.2中,我收到「錯誤:使用未聲明的標識符'unsafeBitCast'」。 – devios1 2016-03-04 17:47:40

17

expression的lldb格式在XCode 7.3中似乎發生了變化。下面讓我開始:

(lldb) expr -l Swift -- import UIKit 
(lldb) expr -l Swift -- let $view = unsafeBitCast(0x7fb75d8349c0, UIView.self) 
7

從Xcode 8/Swift 3開始,這裏是對我有用的。 (這是基於離@sfaxon's answer。)

(lldb) expr -l Swift -- import UIKit 
(lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self) 
2

由於上述所有問題的答案,unsafeBitCast也和Xcode 8.3.2 /斯威夫特3/MacOS的/可可應用效果很好。

記住當前實例的地址

(lldb) p tabView.controlTint 
(NSControlTint) $R10 = defaultControlTint 

(lldb) p self 
(LearningStoryboard.NSTabViewController) $R11 = 0x00006080000e2280 { 
..... 

後來,檢查它們

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint 
(NSControlTint) $R20 = graphiteControlTint 

(lldb) p $R11.tabView.controlTint 
(NSControlTint) $R21 = graphiteControlTint 

如果這樣的事情發生

(lldb) p unsafeBitCast(0x00006080000e2280, to: NSTabViewController.self).tabView.controlTint 
error: use of undeclared identifier 'to' 

(lldb) p $R11.tabView.controlTint 
error: use of undeclared identifier '$R11' 

確保選擇的堆棧幀的一個Swift源代碼而不是彙編程序。

很可能在應用程序中通過單擊暫停按鈕暫停或異常停止發生。通過相應地選擇堆棧幀,讓lldb推斷適當的編程語言。

4

自定義類的,你需要輸入你的項目

expr -l Swift -- import MyTestProject 
expr -l Swift -- let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self) 
expr -l Swift -- print($vc.view) 
相關問題