Понимание вывода GDB - содержание памятиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Понимание вывода GDB - содержание памяти

Сообщение Anonymous »

Я отлаживаю Segfault в программе C ++, но сначала я пытаюсь получить лучшее представление об использовании GDB для проверки макета памяти в файле Core, который производится, когда процесс Segfaults. Я использую следующую игрушечную программу, которая намеренно сетчалась, чтобы лучше понять вывод GDB .

Код: Выделить всё

int main() {
int a = 4;
int b = 12;
*(int *)0 =11;
return a + b;
}
Когда я открываю файл Core (используя GDB my_executable path/to/core.pid ) Я могу видеть адреса памяти, которые содержат значения и b , которые имеют смысл, так как sizeof (int) == 4 :

Код: Выделить всё

(gdb) p &a
$5 = (int *) 0x7ffff940e078
(gdb) p &b
$6 = (int *) 0x7ffff940e07c
И когда я прошу содержимое памяти, начинающееся AT & A Это имеет смысл, за исключением того, что я на машине Intel, который должен быть маленьким эндсином, и, похоже, эти целые числа - большие эндиан:

Код: Выделить всё

(gdb) x/4x &a
0x7ffff940e078: 0x00000004      0x0000000c      0xf940e120      0x00007fff
# (added by me) ---a==4---      --b==12---      other stuff ->
< /code>
Итак, если я попрошу содержимое памяти, начиная с следующего адреса, я ожидаю следующего (все байты сдвинут один влево): < /p>
(gdb) x/4x 0x7ffff940e079
0x7ffff940e079: 0x00000400      0x00000cf9      0x40e12000      0x007fff..
Но что GDB на самом деле печатает:

Код: Выделить всё

(gdb) x/4x 0x7ffff940e079
0x7ffff940e079: 0x0c000000      0x20000000      0xfff940e1      0xca00007f
#               --b==12?--      other stuff ->
Похоже, что мы прыгнули вперед 7 байтов, или что мы прыгнули вперед на 4 байта, а теперь B - маленький эндсиан. Но память после этого первого 0x0c байт отличается от того, что она была в последней команде (до того, как это было 0xf940e ... Теперь это 0x2000 ... ). Я случайно читаю память с различным выравниванием? И есть идея, почему значения кажутся большими?>

Подробнее здесь: https://stackoverflow.com/questions/795 ... ry-content
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»