Проверяет ли GDB команды обратные байты? - PullRequest
0 голосов
/ 24 января 2020

Меняет ли GDB порядок байтов при распечатке фрагментов из нескольких слов (4 байта)? Если так, то почему? Это как-то связано с тем, как программы читают память?

Вот пример кода, демонстрирующий то, что я имею в виду под в обратном порядке

// test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
  int large = 33825;              // 1000 0100 0010 0001
  int zero = 0;                   // 0000 0000 0000 0000
  int ten = 10;                   // 0000 0000 0000 1010
  printf("GDB test program\n");
  return 0;
}

Скомпилируйте и запустите программа с gdb:

$ gcc -z execstack -g -fno-stack-protector test.c -o test
$ gdb test
(gdb) break 9
Breakpoint 1 at 0x8048441: file test.c, line 9.
(gdb) run
Breakpoint 1, main (argc=1, argv=0xbfffeff4) at test.c:9
9     return 0;

(gdb) # get the address of the ten variable (which has the smallest memory address location)
(gdb) print &ten 
$2 = (int *) 0xbfffef34

(gdb) # print the first byte of the ten variable
(gdb) x /1tb 0xbfffef34
0xbfffef34: 0000 1010

(gdb) # print the entire memory (4 bytes) allocated for the ten variable (0xbfffef34 - 0xbfffef38)
(gdb) x /1tw 0xbfffef34
0xbfffef34: 0000 0000 0000 0000 0000 0000 0000 1010
(gdb) # Why is "0000 0000" the first octet instead of "0000 1010"
(gdb) # It seems like the print order of the bytes are reversed


(gdb) # Another example
(gdb) # print the entire memory (4 bytes) allocated for the large variable (0xbfffef3c - 0xbfffef3f)
(gdb) x /1tw 0xbfffef3c
0xbfffef3c: 0000 0000 0000 0000 1000 0100 0010 0001

(gdb) x /1tb 0xbfffef3c
0xbfffef3c: 0010 0001

(gdb) x /1tb 0xbfffef3d
0xbfffef3d: 1000 0100

(gdb) x /1tb 0xbfffef3e
0xbfffef3e: 0000 0000

(gdb) x /1tb 0xbfffef3f
0xbfffef3f: 0000 0000

Когда я печатаю всю переменную, она читает, как я обычно читаю двоичный файл (самый значительный октет слева)

Когда я печатаю первый октет та же самая переменная отображает наименее значимый октет.

Меняет ли GDB порядок октетов, чтобы сделать его более читабельным? Это как-то связано с тем, как компьютер читает память?

1 Ответ

1 голос
/ 24 января 2020

print печатает переменные так, как человек ожидал, что они будут напечатаны (как целые числа).

examine печатает их как байты в памяти, не изменяя их, чтобы компенсировать порядковый номер, который использует компьютер .

...