如何使用 LLDB 打印内存地址的内容?
Posted
技术标签:
【中文标题】如何使用 LLDB 打印内存地址的内容?【英文标题】:How to print the contents of a memory address using LLDB? 【发布时间】:2013-11-13 23:00:24 【问题描述】:我正在使用 LLDB,想知道如何打印特定内存地址的内容,例如 0xb0987654。
【问题讨论】:
你试过print *(int*)0xb0987654
吗?
我收到了错误,错误:Could't dematerialize struct : (null) Errored out in Execute: Couldn't FinalizeJITExpression
我可以切换到 gdb 吗?我正在使用 XCode5
可能是的。你试过了吗? (你可以安装gdb
,也许通过从源代码编译它)。
当您像这样直接打印内存时,“无法取消实体化结构”通常意味着内存不可读。错误消息很可怕,但要正确处理却很棘手。您可以使用“内存读取”来判断这是否是真的。
【参考方案1】:
Xcode 有一个非常漂亮的 Memory Browser 窗口,它可以很好地显示内存地址的内容。它还允许您控制字节分组和显示的字节数,以及向后或向前移动内存页:
您可以按⌘^⌥⇧M
访问它。输入后按回车键在主编辑器中打开内存浏览器。
或
调试 --> 调试工作流程 --> 查看内存
注意左下角的字段,您可以在其中粘贴要检查的内存地址!
此处的文档:https://developer.apple.com/library/ios/recipes/xcode_help-debugger/articles/viewing_memory.html
这里有相关答案:How do I open the memory browser in Xcode 4?
【讨论】:
有史以来最好的快捷键:有时它们是 2-3 个特殊键的组合(⌘^⇧、⌘⌥⇧、^⌥⇧ 或其他)。苹果没有捷径,他们全力以赴。 @drewster 确实如此,但由于 Xcode 的新用户体验,您必须决定在哪里打开内存浏览器(所以只需在输入快捷方式后按 Enter) xcode 是 xcode。 Q 是关于 LLDB 的。它们不是一回事。【参考方案2】:例如,长度为 16x4 字节的打印内存。
x/16 0xb0987654
【讨论】:
【参考方案3】:这是在 lldb 中显示固定长度的类型化数组的简单技巧。如果您的程序包含一个指向 9 个元素的 long* 变量,您可以声明一个包含 9 个 long 值的固定数组的结构类型,并将指针强制转换为该类型:
long *values = new long[9]...;
(lldb) expr typedef struct long values[9]; l9; *(l9 *)values
(l9) $1 =
values =
[0] = 0
[1] = 1
[2] = 4
[3] = 9
[4] = 16
[5] = 25
[6] = 36
[7] = 49
[8] = 64
我在用 C 编码时使用 typedef,在 C++ 中不需要。
【讨论】:
【参考方案4】:补充迈克尔的回答。
我倾向于使用:
memory read -s1 -fu -c10000 0xb0987654 --force
这将在调试器中打印。
-
-s 用于字节分组,例如 uint8 使用 1,int 使用 4
-f 用于格式。我天生就忘记了正确的符号。只需将语句与 -f 结合起来,它就会向您回弹并为您提供所有选项的列表
-c 用于字节数
如果打印超过 1024 个字节,请附加 --force
希望这会有所帮助。
【讨论】:
【参考方案5】:“me
”是您要查找的命令。
例如,这个 lldb 命令:
me -r -o /tmp/mem.txt -c512 0xb0987654
将从您的内存地址复制 512 个字节到 /tmp/mem.txt 的文件中。
【讨论】:
我在 Apple macOS 11.3 版本lldb-1200.0.44.2
上使用 lldb,我不得不稍微更改命令:me read -o /tmp/mem.txt -c512 0xb0987654
以上是关于如何使用 LLDB 打印内存地址的内容?的主要内容,如果未能解决你的问题,请参考以下文章