2015-04-04 39 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) 
相关问题