LLDB(Swift):将原始地址转换为可用types

是否有一个LLDB命令可以将一个原始地址转换成一个可用的Swift类?

例如:

(lldb) po 0x7df67c50 as MKPinAnnotationView 

我知道这个地址指向一个MKPinAnnotationView,但它不在我可以select的框架中。 但是,我想将原始地址转换为MKPinAnnotationView,以便我可以检查其属性。 这可能吗?

在xCode 8.2.1和Swift 3下,lldb命令pop将不能使用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)