ios - LLDB(快速):將原始地址轉換為可用類型




swift (8)

Objective-C版本

po ((MKPinAnnotationView *)0x7df67c50).alpha

是否有一個LLDB命令可以將原始地址轉換為可用的Swift類?

例如:

(lldb) po 0x7df67c50 as MKPinAnnotationView

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


在Xcode 8.2.1和Swift 3下,lldb命令 po p 不適用於類型變量。 您將需要使用swift命令 print 檢查鍵入的對象實例的屬性。 (感謝大 人們的回答 !)例如:

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

從Xcode 8 / Swift 3開始,這對我有用。 (這是基於 @sfaxon的回答 。)

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

您可以使用Swift的 unsafeBitCast 函數將地址 unsafeBitCast 轉換為對象實例:

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

然後,您可以照常使用 $pin –訪問屬性,調用方法等。

請查看本文以獲取更多信息: Swift Memory Dumping


最簡單的方法,迅速4

expr unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self)

用於 expression 的lldb格式在Xcode 7.3中似乎已更改。 以下讓我開始:

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

當您的LLDB會話在Swift上下文中啟動時,@ Xi Chen的答案非常有效。 但是,在某些情況下,您可能已在Swift上下文 之外 的斷點 停止; 例如,當它是Objective-C API的符號斷點時。

error: unknown type name 'let'
error: use of undeclared identifier 'unsafeBitCast'

在這種情況下,您將需要使用Objective-C的舊方法:

e MKPinAnnotationView *$pin = (MKPinAnnotationView *)0x7df67c50

現在您可以使用 $pin


po 是一個別名,這意味著它可以被覆蓋。 您可以使用objc處理十六進制地址來覆蓋 po

command regex po
s/(0x[[:xdigit:]]+)/expression -l objc -O -- %1/
s/(.+)/expression -O -- %1/

若要查看其效果,可以告訴lldb擴展這些別名:

(lldb) settings set interpreter.expand-regex-aliases true

我還創建了 https://github.com/kastiglione/swift_po ,它是Swift的替代版本。 它處理對像地址,並且還有其他一些改進。





lldb