Интерпретировать шестнадцатеричный дамп памяти GDB / LLDB - PullRequest
0 голосов
/ 17 марта 2019

Почему 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;
}

Я создал точку остановав операторе возврата и использовал x/20xb address_ptr в GDB, чтобы показать мне 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 делает это и почему только при печати шестнадцатеричных по четыре байта на блок и почему порядок не меняется при печати в шестнадцатеричном формате несгруппированной памяти.

Заранее спасибо:)

...