lldb:打印变量的地址

Gae*_*eul 11 memory-address lldb

我正在尝试使用打印变量的地址lldb.但是,调用print &(myVar)打印变量的内容而不是其地址.

(lldb) print &(myVar)
(const string *) $18 = "hello"
Run Code Online (Sandbox Code Playgroud)

同样的expression &(myVar).

(lldb) expression &(myVar)
(const string *) $19 = "hello"
Run Code Online (Sandbox Code Playgroud)

我也尝试过expression-L选项:

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

(lldb) expression -L -- myVar
0x0000000002a15430: (std::string) $23 = "hello"
Run Code Online (Sandbox Code Playgroud)

但是每次调用时输出的地址都会改变expression -L.因此我假设它不对应于内存中变量的地址.

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

(我使用lldb 3.4)

Jim*_*ham 16

是的,-L位置告诉您lldb用于表示表达式结果的变量,因此这不是您想要的.即使常见命令别名print使得它看起来像这个命令只打印值,它还会做很多事情:例如在正在运行的程序中创建新实体.因此,表达式结果的位置与您评估的表达式并不简单相关.

无论如何,有两种简单的方法可以解决这个问题.第一个是关闭字符串摘要,这样你就可以看到打印地址的实际结果:

(lldb) expr --raw -- &my_string
(string *) $14 = 0x00007fff5fbff618
Run Code Online (Sandbox Code Playgroud)

获取相同数据的另一种方法是使用"frame variable"命令.此命令使您可以访问本地变量,而无需完整表达式解析器的开销.由于frame variable调试信息直接打印变量,因此-L选项恰好是变量的位置:

(lldb) frame var -L my_string
0x00007fff5fbff618: (std::__1::string) my_string = "Some string here"
Run Code Online (Sandbox Code Playgroud)