如何使用 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 打印内存地址的内容?的主要内容,如果未能解决你的问题,请参考以下文章

内存地址上的观察点

如何 gdb 如何打印一个地址中的内容

在 LLDB 中获取有关坏内存地址的信息

java String 内存地址问题?如何获取 String 内存地址!

c++如何找到进程中的输出表内存地址(OD的bp)

iOS-LLDB 常用命令梳理