Почему GDB 'x / w' и 'x / g' показывают разные значения? - PullRequest
0 голосов
/ 18 апреля 2020

В моей программе есть точка, в которой она сравнивает переменную (хранится в rbp-0x84) с 0x1. Однако, когда я go вижу, что там, я получаю противоречивые результаты.

gef➤  x/w $rbp-0x84
0x7fffffffdf5c: 0x00000000
gef➤  x/g $rbp-0x84
0x7fffffffdf5c: 0x0000000500000000

Как первые 8 бит меняются с 0x0 на 0x5?

Что приводит меня к моему Следующая проблема ... когда я пытаюсь:

gef➤  set $rbp-0x84 = 0x1
gef➤  x $rbp-0x84
0xffffffffffffff7d: Cannot access memory at address 0xffffffffffffff7d

Как изменился адрес go с 0x7fffffffdf5 c до 0xffffffffffffff7d?

1 Ответ

2 голосов
/ 18 апреля 2020

Младшие 32 бита 0x0000000500000000 - все нули. x86 имеет младший порядок. Первые 8 бит старшей работы GDB (слово x86) в GDB-гиганте (x86 qword) равны 5.

Дамп как отдельные байты, чтобы увидеть это, например, x /8xb

Поскольку $rbp - 0x84 равно 0xff..., set $rbp-0x84 = 0x1 изменило RBP (сам регистр) до некоторого небольшого числа, поэтому x $rbp-0x84 переносит.

Это не изменит память, потому что вы этого не сделали разыменуйте его как значение указателя, например *(long*)($rbp-0x84) = 1. x содержит неявное разыменование (оно берет указатель arg и показывает вашу память). set и print нет.

Я удивлен, что это вообще сработало с выражением в левой части назначения. Это не разрешено в C, но, очевидно, GDB это позволяет. На самом деле я тестировал, и он выдает $rbp = 1 в GDB 9.1.

После этого изменения в RBP, $rbp - 0x84 - это число чуть ниже 0, то есть 0xff ..... Обратите внимание, что это не 0x7f... больше и шире 1 . Эта страница не отображается. (И забавный факт; Linux никогда не позволит вам отобразить эту виртуальную страницу даже в ядре, потому что значения в этом диапазоне рассматриваются как коды ошибок, а не действительные указатели.)

сноска 1: Виртуальные адреса в пользовательском пространстве имеют ширину не более 47 бит (до тех пор, пока процессоры PML5 с таким большим объемом оперативной памяти, что ОС решит использовать дополнительный уровень таблиц страниц). Linux ставит стек ближе к вершине.

...