LLDB-如何打印全局变量的值
LLDB - How do I print a value of global variable?
在我的情况下,堆栈没有正确解码,所以我不能使用与帧相关的命令。我试图使用某种绝对名称来读取特定模块中的变量。
我找到了变量:
(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
但这很不方便,因为它需要多个步骤,而且我必须自己指定变量类型。
如果您有要打印的符号的调试信息,那么您的"打印"尝试就会成功。但是,您似乎没有具有此符号的库的调试信息,或者image lookup -v
会打印定义编译单元。
但是,您确实有一个符号(image lookup -v
命令找到了它)。因此,您应该能够打印符号中的值。
问题是,如果你给lldb一个去映射的名称os::_mem_serialize_page
,它将从试图找到"os"开始(这样它就可以在该类或命名空间中找到_mem_serialize_page。)由于没有类型,它对"os"一无所知,它将到此为止。
但是,如果你给lldb一个错误的名称,lldb将直接从符号表中查找它,它将能够从那里转到地址。这将省去上面的一个步骤。
但是,必须告诉lldb变量类型是没有办法的。如果没有调试信息,lldb就无法知道类型,也无法在不知道的情况下真正打印值。
使用Jim Ingham
关于image lookup -v
的提示,我认为可以使用其损坏的名称读取变量:
- 识别损坏的名称:
(lldb) image lookup -v -s os::_mem_serialize_page libjvm.dylib
<snip> name="os::_mem_serialize_page", mangled="_ZN2os19_mem_serialize_pageE" <snip>
- 从现在起,这个名称可以用来读取变量
(lldb) p _ZN2os19_mem_serialize_pageE
(void *) $5 = 0x0000000000000000
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- LLDB-如何打印全局变量的值
- LLVM-如何将ConstantExpr转换为ConstantDataArray,以便打印全局变量char*的值
- 在函数中打印全局变量而不是 :: 运算符的任何替代方法
- 如何打印地图?让它成为一个全局变量?C++
- std::string 是全局变量时不能在 gdb 中打印,为什么?
- 如何在循环外打印总和?我认为全局变量和局部变量的减速存在一些错误