LLDB-如何打印全局变量的值?

时间:2019-01-22 10:52:12

标签: c++ debugging lldb

就我而言,堆栈未正确解码,因此无法使用与帧相关的命令。 我正在尝试使用某种绝对名称从特定模块读取变量。

我能够找到该变量:

(lldb) image lookup -s os::_mem_serialize_page libjvm.dylib
Address: libjvm.dylib[0x00000000009bd690] (libjvm.dylib.__DATA.__common + 151184)
Summary: libjvm.dylib`os::_mem_serialize_page

但是,我不明白如何读取其值

(lldb) print os::_mem_serialize_page
error: use of undeclared identifier 'os'

(lldb) print libjvm.dylib`os::_mem_serialize_page
error: use of undeclared identifier 'libjvm'

(lldb) x/g libjvm.dylib[0x00000000009bd690]
error: invalid start address expression.
error: address expression "libjvm.dylib[0x00000000009bd690]" evaluation failed

我找到的唯一方式

查找地址,方法1

(lldb) image lookup -v -s os::_mem_serialize_page libjvm.dylib
Address: libjvm.dylib[0x00000000009bd690] (libjvm.dylib.__DATA.__common + 151184)
Summary: libjvm.dylib`os::_mem_serialize_page
 Module: <snip>
 Symbol: id = {0x0000e81e}, range = [0x000000010ee46690-0x000000010ee46698), name="os::_mem_serialize_page", mangled="_ZN2os19_mem_serialize_pageE"

查找地址,方法2

(lldb) image dump symtab libjvm.dylib
Index   UserID DSX Type            File Address/Value Load Address       Size               Flags      Name
------- ------ --- --------------- ------------------ ------------------ ------------------ ---------- ----------------------------------
[59422]  59422     Data            0x00000000009bd690 0x000000010ee46690 0x0000000000000008 0x001e0000 os::_mem_serialize_page

读取地址处的内存以获取变量的值

(lldb) x/g 000000010ee46690
0x10ee46690: 0x0000000000000000

但这很不方便,因为它需要多个步骤,而且我必须自己指定变量类型。

1 个答案:

答案 0 :(得分:2)

如果您有要打印的符号的调试信息,则您的“打印”尝试将奏效。但是,看起来好像您没有具有该符号的库的调试信息,否则image lookup -v会打印出定义的编译单元。

但是,确实有一个符号(您的image lookup -v命令找到了)。因此,您应该能够从符号中打印值。

问题是,如果为lldb赋予去杂的名称os::_mem_serialize_page,它将首先尝试查找“ os”(因此可以在该类或名称空间中找到_mem_serialize_page。)由于没有类型,因此它对“ os”一无所知,它将停在那里。

但是,如果您给lldb指定了错误的名称,则lldb可以直接从符号表中查找它,并且可以从那里到地址。这将省去上面的步骤之一。

但是,不必告诉lldb变量类型。没有调试信息,lldb无法知道类型,并且无法真正输出不知道该值的值。