Я отлаживаю 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