LLDB(Swift):将原始地址转换为可用types
是否有一个LLDB命令可以将一个原始地址转换成一个可用的Swift类?
例如:
(lldb) po 0x7df67c50 as MKPinAnnotationView
我知道这个地址指向一个MKPinAnnotationView,但它不在我可以select的框架中。 但是,我想将原始地址转换为MKPinAnnotationView,以便我可以检查其属性。 这可能吗?
在xCode 8.2.1和Swift 3下,lldb命令po或p将不能使用typesvariables。 您将需要使用swift命令打印来检查types对象实例的属性。 (感谢cbowns的回答 !)例如:
(lldb) expr -l Swift -- import UIKit (lldb) expr -l Swift -- let $pin = unsafeBitCast(0x7df67c50, to: MKPinAnnotationView.self) (lldb) expr -l Swift -- print($pin.alpha)
您可以使用Swift的unsafeBitCast
函数将地址转换为对象实例:
(lldb) e let $pin = unsafeBitCast(0x7df67c50, MKPinAnnotationView.self) (lldb) po $pin
然后你可以像往常一样使用$pin
– 访问属性,调用方法等
看看这篇文章的更多信息: 快速内存转储 。
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的答案 。)
(lldb) expr -l Swift -- import UIKit (lldb) expr -l Swift -- let $nav = unsafeBitCast(0x1030ff000, to: UINavigationController.self)
感谢上面的所有答案, unsafeBitCast也适用于Xcode 8.3.2 / Swift 3 / macOS / Cocoa Application。
记住当前实例的地址
(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'
确保selectSwift源代码的一个堆栈帧而不是汇编器。
当应用程序通过单击“ 暂停”button暂停或exception停止时,可能会发生这种情况。 相应地select一个堆栈框架,让lldb推断一个合适的编程语言。
对于自定义类,您需要导入您的项目
expr -l Swift -- import MyTestProject expr -l Swift -- let $vc = unsafeBitCast(0x7fad22c066d0, ViewController.self) expr -l Swift -- print($vc.view)