lldb:打印变量的地址

问题描述 投票:0回答:2

我正在尝试使用

lldb
打印变量的地址。但是,调用
print &(myVar)
打印变量的内容而不是它的地址。

(lldb) print &(myVar)
(const string *) $18 = "hello"

expression &(myVar)
.

(lldb) expression &(myVar)
(const string *) $19 = "hello"

我也试过

expression
-L
选项:

(lldb) expression -L -- &(myVar)
0x00000000021aea80: (const string *) $20 = "hello"

(lldb) expression -L -- myVar
0x0000000002a15430: (std::string) $23 = "hello"

但是每次我调用

expression -L
时输出的地址都会改变。因此我假设它不对应于内存中变量的地址。

如何获取变量在内存中的地址?

(我使用 lldb 3.4)

memory-address lldb
2个回答
37
投票

是的,-L 位置告诉您 lldb 用来表示表达式结果的变量,所以这不是您想要的。尽管通用命令别名

print
使该命令看起来只是打印值,但它的作用远不止于此:例如在正在运行的程序中创建新实体。因此,表达式结果的位置与您评估的表达式并没有无关紧要的关系。

无论如何,有两种简单的方法可以做到这一点。首先是关闭字符串摘要,这样可以看到打印地址的实际结果:

(lldb) expr --raw -- &my_string
(string *) $14 = 0x00007fff5fbff618

获取相同数据的另一种方法是使用“帧变量”命令。此命令使您可以访问局部变量,而无需完整表达式解析器的开销。由于

frame variable
直接打印调试信息报告的变量,在这种情况下 -L 选项正是变量的位置:

(lldb) frame var -L my_string
0x00007fff5fbff618: (std::__1::string) my_string = "Some string here"

0
投票

请允许我补充上面@Jim Ingham 的出色答案。

关于这个主题有一个非常好的教程检查堆栈框架状态.

虽然可能需要几分钟,但一个好的提示是首先使用以下命令转储所有可用的堆栈帧变量:

frame variable

确认所需变量可用后,可以运行:

frame variable myVar

或者,包括提到的地址:

frame variable -L myVar

就个人而言,我喜欢添加一个 Xcode 调试操作 - 无需暂停执行 - 如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.