是否有可以將原始地址轉換爲可用Swift類的LLDB命令?LLDB(Swift):將原始地址轉換爲可用類型
例如:
(lldb) po 0x7df67c50 as MKPinAnnotationView
我知道這個地址指向一個MKPinAnnotationView,但它不是我能選擇的框架。但是,我想將原始地址轉換爲MKPinAnnotationView,以便我可以檢查其屬性。這可能嗎?
是否有可以將原始地址轉換爲可用Swift類的LLDB命令?LLDB(Swift):將原始地址轉換爲可用類型
例如:
(lldb) po 0x7df67c50 as MKPinAnnotationView
我知道這個地址指向一個MKPinAnnotationView,但它不是我能選擇的框架。但是,我想將原始地址轉換爲MKPinAnnotationView,以便我可以檢查其屬性。這可能嗎?
在xcode中8.2.1和夫特3,LLDB命令PO或p不會與類型的變量工作。您將需要使用快速命令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)
您可以使用雨燕的unsafeBitCast
函數的地址轉換爲一個對象實例:
(lldb) e let $pin = unsafeBitCast(0x7df67c50, MKPinAnnotationView.self)
(lldb) po $pin
然後你就可以用$pin
照常上班 - 訪問屬性,調用方法等
看看這個文章的更多信息:Swift Memory Dumping。
對於第一個發言,我認爲你忘了「expr的」或「表達」。否則,它工作得很好! – jarrodparkes 2015-04-04 04:13:01
謝謝......修正! – gregheo 2015-04-04 04:14:36
在Xcode 7.2中,我收到「錯誤:使用未聲明的標識符'unsafeBitCast'」。 – devios1 2016-03-04 17:47:40
expression
的lldb格式在XCode 7.3中似乎發生了變化。下面讓我開始:
(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $view = unsafeBitCast(0x7fb75d8349c0, UIView.self)
從Xcode 8/Swift 3開始,這裏是對我有用的。 (這是基於離@sfaxon's answer。)
(lldb) expr -l Swift -- import UIKit
(lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self)
由於上述所有問題的答案,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推斷適當的編程語言。
自定義類的,你需要輸入你的項目
expr -l Swift -- import MyTestProject
expr -l Swift -- let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self)
expr -l Swift -- print($vc.view)
這真的不應該這麼難 – 2017-11-07 22:24:18
這是一個有點直觀。我以爲我不需要在控制檯中輸入'(lldb)'。但沒有這個,它就無法工作。 – Honey 2017-12-13 16:53:09