解释GDB / LLDB十六进制内存转储

时间:2019-03-16 23:07:07

标签: c memory gdb lldb

为什么GDB按单词分组时会以相反的顺序打印内存?

我对内存的外观很感兴趣,并创建了一个基本的C结构:

typedef struct example_struct {
    char foo[17];
} example_struct;

int main() {
    struct example_struct *address_ptr;

    char char_string[] = "AZZZBZZZCZZZDZZZ";

    address_ptr = (example_struct *) malloc(sizeof(example_struct));
    strcpy(address_ptr->foo, char_string);

    return 1;
}

我在return语句中创建了一个断点,并在gdb中使用x/20xb address_ptr向我显示了20个字节的原始内存。看起来完全符合预期:

(lldb) x/20xb address_ptr
0x7fbf40500190: 0x41 0x5a 0x5a 0x5a 0x42 0x5a 0x5a 0x5a
0x7fbf40500198: 0x43 0x5a 0x5a 0x5a 0x44 0x5a 0x5a 0x5a
0x7fbf405001a0: 0x00 0x00 0xd7 0xa1

但是,当使用x/5xw(将内存分为字,每个块4个字节,5乘以4个字节也等于20个字节)时,我遇到了一些奇怪的事情:

(lldb) x/5xw address_ptr
0x7fbf40500190: 0x5a5a5a41 0x5a5a5a42 0x5a5a5a43 0x5a5a5a44
0x7fbf405001a0: 0xa1d70000

每个块都必须从右到左读取。为什么会这样?

这是正确的吗?何时:为什么将4个字节分组在一起时的读取方向颠倒了?由于最常见的体系结构上的内存是字节可寻址的(就像我的一样),我认为反向表示不是它在内存中的实际存储方式,是吗?

我只是想知道,也许有人会启发我,为什么gdb这样做,为什么只在每个块以四个字节打印十六进制时,为什么在以未分组的内存十六进制格式打印时顺序却不颠倒呢?

预先感谢:)

0 个答案:

没有答案