如何使用LLDB打印内存地址的内容?

66

我正在使用LLDB,想知道如何打印特定内存地址的内容,例如0xb0987654。


4
你有尝试过执行 print *(int*)0xb0987654 吗? - Basile Starynkevitch
1
我收到了错误信息,错误:无法去物质化结构体:(空) 在执行时出现错误:无法完成JIT表达式。 - Adam Lee
我可以切换到gdb吗?我正在使用XCode5。 - Adam Lee
可能是的。你试过了吗?(你可以安装gdb,也许通过从源代码编译它)。 - Basile Starynkevitch
1
当您像这样直接打印内存时,“无法取消材料化结构”通常意味着该内存不可读。错误消息很糟糕,但是正确地解决它其实很棘手。您可以使用“memory read”来确定是否真的如此。 - Jim Ingham
显示剩余2条评论
5个回答

76

为了补充迈克尔的答案。

我倾向于使用:

memory read -s1 -fu -c10000 0xb0987654 --force

这将在调试器中打印。

  1. -s用于字节分组,例如对于uint8使用1,对于int使用4
  2. -f用于格式。我本能地忘记正确的符号。只需使用-f语句,它会自动返回并给出所有选项的列表
  3. -c用于字节数计数
  4. 如果要打印超过1024个字节,请追加--force

希望这可以帮到你。


74
Xcode有一个非常好的"内存浏览器"窗口,可以很好地显示内存地址的内容。它还允许您控制字节分组和要显示的字节数,并向前或向后移动内存页面。您可以通过按下 "⌘^⌥⇧M "来访问它。输入完毕后,请按回车键在主编辑器中打开内存浏览器。
或者,您可以通过 "调试-->调试工作流程-->查看内存" 来访问它。请注意其左下角的字段,您可以将要检查的内存地址粘贴到该字段中!
文档在这里:https://developer.apple.com/library/ios/recipes/xcode_help-debugger/articles/viewing_memory.html。相关答案在这里:如何打开Xcode 4中的内存浏览器?

最好的快捷键:有时它们是2-3个特殊键的组合(⌘^⇧,⌘⌥⇧,^⌥⇧或其他)。苹果公司的快捷键已经用尽了,他们全力以赴。 - Dog
1
@drewster,是的,但由于Xcode的新用户体验,您必须决定在哪里打开内存浏览器(因此只需在输入快捷键后按Enter即可)。 - Eric
1
Xcode是Xcode。问题是关于LLDB的。它们不是同一件事。 - RichieHH

12
例如,打印长度为16x4字节的内存。
x/16  0xb0987654

12
"me"是您要查找的命令。 例如,此lldb命令:
me -r -o /tmp/mem.txt -c512 0xb0987654

将从您的内存地址复制512字节到/tmp/mem.txt文件中。


1
我正在使用苹果macOS 11.3版本的lldb lldb-1200.0.44.2,并且我不得不稍微修改一下命令:me read -o /tmp/mem.txt -c512 0xb0987654 - neuralmer

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++中不需要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接