是否有可以将原始地址转换为可用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