如何定义和使用LLDB用户变量?

Ver*_*con 4 lldb swift

我正在定义lldb用户变量,如下所示(lldb没有报告错误):

(lldb) expression -l swift -- let $servicesButton  = unsafeBitCast(0x127979670, to: UIButton.self)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用变量时,我得到:

(lldb) po $servicesButton  
error: use of undeclared identifier '$servicesButton'  
(lldb) po $servicesButton.isEnabled  
error: use of undeclared identifier '$servicesButton'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

顺便说一句:万一这很重要,我通过单击“调试视图层次结构”按钮闯入了调试器。然后,我打印了UIButton的描述,并在上面的unsafeBitCast中使用了显示的内存地址。

更新:我正在使用Xcode10。这是另一个lldb命令系列,用于说明我的问题:

(lldb) expression var $temp = 5
error: unknown type name 'var'
(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
(lldb) expression int $xxx = 5
(lldb) po $xxx
5
Run Code Online (Sandbox Code Playgroud)

更新2:我似乎要到某个地方:

(lldb)  settings set target.language swift
(lldb) expression let $yyy = 88
(lldb) po $yyy
88
Run Code Online (Sandbox Code Playgroud)

更新3:最后!设置目标语言可以解决问题。我不知道为什么我对“ -l swift”选项的使用还不够,但是我很高兴能继续前进。

(lldb) settings set target.language swift
(lldb) expression
Enter expressions, then terminate with an empty line to evaluate:
1 import UIKit
2 let $button = unsafeBitCast(0x105a23e10, to: UIButton.self)
3 
(lldb) po $button
<UIButton: 0x105a23e10; frame = (134.5 3; 74 29); clipsToBounds = YES; opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x101b7b180>>

(lldb) po $button.isEnabled
false

(lldb) 
Run Code Online (Sandbox Code Playgroud)

Jim*_*ham 5

“表达式”命令从当前所选框架的语言中选择要使用的语言。如果只是中断程序以运行视图调试器,则当前帧可能是C,ObjC或C ++,这就是为什么必须将-l标志设置为swift的原因。您发现,一个棘手的交互是:

(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
Run Code Online (Sandbox Code Playgroud)

为此,您必须记住“ po”实际上是以下内容的别名:

(lldb) expr -O -- <EXPRESSION>
Run Code Online (Sandbox Code Playgroud)

-O标志的含义是“打印提供的表达式结果的对象描述”。如果这样做help po,它将在帮助文本的底部告诉您。

因此,po首先使用您提供的表达式,使用当前语言运行它(您将看到运行的方向...),然后获取特定于语言的对象描述方法(例如,在Swift中,通过运行对象的Mirror),打印出来。您正确地将$ temp设为快速变量,但是您尝试获取名为$ temp的C变量的对象描述,该对象不存在。

如果要在任何框架中使用“ po”并将其应用于swift对象,则需要强制使用默认语言进行swift(您使用settings set命令的方式),或者需要运行:

(lldb)expr -O -l swift-

注意,顺便说一句,您不能执行以下操作:

(lldb)po -l swift

因为po别名的结尾--是您提供选项的标记,而命令上所有其余文本都是表达式。这样做是为了:

(lldb)宝-5

并没有混淆地告诉你没有所谓的5...