如何定义和使用 LLDB 用户变量?
How Do I Define And Use An LLDB User Variable?
我正在定义一个lldb用户变量如下(lldb没有报错):
(lldb) expression -l swift -- let $servicesButton = unsafeBitCast(0x127979670, to: UIButton.self)
当我尝试使用我得到的变量时:
(lldb) po $servicesButton
error: use of undeclared identifier '$servicesButton'
(lldb) po $servicesButton.isEnabled
error: use of undeclared identifier '$servicesButton'
我做错了什么?
顺便说一句:以防万一,我通过单击“调试视图层次结构”按钮进入了调试器。然后我打印了一个 UIButton 的描述,并在上面的 unsafeBitCast 中使用了显示的内存地址。
更新:我正在使用 Xcode 10。这是说明我的问题的另一系列 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
更新 2:我似乎有所进展:
(lldb) settings set target.language swift
(lldb) expression let $yyy = 88
(lldb) po $yyy
88
更新 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)
"expression"命令从当前所选框架的语言中选择要使用的语言。如果您只是将程序中断到 运行 视图调试器,则当前帧可能是 C、ObjC 或 C++,这就是您必须将 -l 标志设置为 swift 的原因。你想通了,一个棘手的互动是:
(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
为此你必须记住 "po" 实际上是一个别名:
(lldb) expr -O -- <EXPRESSION>
其中 -O 标志表示 "print the object description of the result of the provided expression." 如果您这样做 help po
它会在帮助文本的底部告诉您。
所以 po 首先获取您提供的表达式,运行使用当前语言(您知道这是怎么回事...),然后获取特定于语言的对象描述方法(例如在Swift 通过 运行 为对象设置镜像)并打印出来。您正确地将 $temp 作为 swift 变量,但您试图获取名为 $temp 的 C 变量的对象描述,该变量并不存在。
如果您想在任何框架中使用 "po" 并将其应用于 swift 对象,您要么需要将默认语言强制为 swift(您使用settings set
命令执行)或者你需要 运行:
(lldb) expr -O -l swift --
请注意,顺便说一句,你不能这样做:
(lldb) po -l swift
因为 po
别名以 --
结尾,这是您完成提供选项的标记,命令中的所有其余文本都是表达式。这样做是为了:
(lldb) po -5
没有混淆地告诉您没有名为 5
...
的选项
我正在定义一个lldb用户变量如下(lldb没有报错):
(lldb) expression -l swift -- let $servicesButton = unsafeBitCast(0x127979670, to: UIButton.self)
当我尝试使用我得到的变量时:
(lldb) po $servicesButton
error: use of undeclared identifier '$servicesButton'
(lldb) po $servicesButton.isEnabled
error: use of undeclared identifier '$servicesButton'
我做错了什么?
顺便说一句:以防万一,我通过单击“调试视图层次结构”按钮进入了调试器。然后我打印了一个 UIButton 的描述,并在上面的 unsafeBitCast 中使用了显示的内存地址。
更新:我正在使用 Xcode 10。这是说明我的问题的另一系列 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
更新 2:我似乎有所进展:
(lldb) settings set target.language swift
(lldb) expression let $yyy = 88
(lldb) po $yyy
88
更新 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)
"expression"命令从当前所选框架的语言中选择要使用的语言。如果您只是将程序中断到 运行 视图调试器,则当前帧可能是 C、ObjC 或 C++,这就是您必须将 -l 标志设置为 swift 的原因。你想通了,一个棘手的互动是:
(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
为此你必须记住 "po" 实际上是一个别名:
(lldb) expr -O -- <EXPRESSION>
其中 -O 标志表示 "print the object description of the result of the provided expression." 如果您这样做 help po
它会在帮助文本的底部告诉您。
所以 po 首先获取您提供的表达式,运行使用当前语言(您知道这是怎么回事...),然后获取特定于语言的对象描述方法(例如在Swift 通过 运行 为对象设置镜像)并打印出来。您正确地将 $temp 作为 swift 变量,但您试图获取名为 $temp 的 C 变量的对象描述,该变量并不存在。
如果您想在任何框架中使用 "po" 并将其应用于 swift 对象,您要么需要将默认语言强制为 swift(您使用settings set
命令执行)或者你需要 运行:
(lldb) expr -O -l swift --
请注意,顺便说一句,你不能这样做:
(lldb) po -l swift
因为 po
别名以 --
结尾,这是您完成提供选项的标记,命令中的所有其余文本都是表达式。这样做是为了:
(lldb) po -5
没有混淆地告诉您没有名为 5
...