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

标签 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

我找到的唯一方法

查找地址,方法一

(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"

查找地址,方法二

(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

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

最佳答案

如果您有尝试打印的符号的调试信息,那么您的“打印”尝试就会成功。但是看起来您没有具有此符号的库的调试信息,或者 image lookup -v 会打印定义的编译单元。

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

问题是如果你给 lldb 一个 demangled 的名字os::_mem_serialize_page,它会从试图找到“os”开始(这样它就可以在那个类或命名空间中找到 _mem_serialize_page。)因为没有类型,它对“操作系统”一无所知,它会停在那里。

但是如果你给 lldb 一个错位的名字,lldb 会直接从符号表中查找它,并且它能够从那里找到地址。这将删除上述步骤之一。

但是,必须告诉 lldb 变量类型是没有办法的。没有调试信息,lldb 无法知道类型,也无法真正打印不知道该类型的值。

关于c++ - LLDB - 如何打印全局变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54306658/

相关文章:

c++ - 用于 C++ 的 Visual Studio 2010 注释插件

ios - 用户界面 TextView /NSAttributedString : iOS Bug?

ios - XCode 宏上的符号断点

wpf - 有没有办法知道 WPF 应用程序中哪个项目具有焦点?

javascript - Firefox - 禁用 'debugger' 关键字

c++ - LLDB 为局部变量给出 "use of undeclared identifier"错误

macos - 为什么我的 mac lldb 生成 lldb 本身无法识别的核心文件?

c++ - Qt API 中仅使用普通指针

c++ - 使用QT开发服务器应用程序是个好主意吗?(QT5)

c++ - 使用 C/C++ 添加用户到 MySQL