Доступ к старым кадрам стека - PullRequest
2 голосов
/ 25 сентября 2019

Если я правильно понимаю, каждый раз, когда вы вызываете функцию C ++, SP (и, возможно, BP) перемещается, чтобы выделить некоторое временное пространство в стеке - кадр стека.И когда функция возвращается, указатели перемещаются обратно, снова освобождая кадр стека.

Но мне кажется, что данные в старом кадре стека все еще там , это просто нессылаться больше.Есть ли какой-нибудь способ заставить GDB показывать мне эти удаленные кадры стека?(Очевидно, что когда вы введете новый кадр стека, он хотя бы частично перезапишет все предыдущие ... но до тех пор кажется, что это возможно.)

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Но мне кажется, что данные в старом фрейме стека все еще там, просто на них больше нет ссылок.

Правильно.

Есть ли какой-нибудь способ заставить GDB показывать мне эти удаленные кадры стека?

Вы можете тривиально посмотреть на неиспользованный стек с помощью команды GDB examine.Например:

void fn()
{
  int x[100];
  for (int j = 0; j < 100; j++) x[j] = (0x1234 << 12) + j;
}


int main()
{
  fn();
  return 0;
}

Сборка и отладка с помощью:

gcc -g t.c
gdb -q ./a.out

(gdb) start
Temporary breakpoint 1 at 0x115f: file t.c, line 10.
Starting program: /tmp/a.out 

Temporary breakpoint 1, main () at t.c:10
10    fn();
(gdb) n
11    return 0;
(gdb) x/40x $rsp-0x40
0x7fffffffdc60: 0x0123405c  0x0123405d  0x0123405e  0x0123405f
0x7fffffffdc70: 0x01234060  0x01234061  0x01234062  0x01234063
0x7fffffffdc80: 0x55555170  0x00005555  0x55555040  0x00000064
0x7fffffffdc90: 0xffffdca0  0x00007fff  0x55555169  0x00005555
0x7fffffffdca0: 0x55555170  0x00005555  0xf7a3a52b  0x00007fff
0x7fffffffdcb0: 0x00000000  0x00000000  0xffffdd88  0x00007fff
0x7fffffffdcc0: 0x00080000  0x00000001  0x5555515b  0x00005555
0x7fffffffdcd0: 0x00000000  0x00000000  0xa91c6994  0xc8f4292d
0x7fffffffdce0: 0x55555040  0x00005555  0xffffdd80  0x00007fff
0x7fffffffdcf0: 0x00000000  0x00000000  0x00000000  0x00000000

Здесь вы можете ясно видеть x все еще в стеке: 0x7fffffffdc60 это то место, где раньше было x[92],0x7fffffffdc70 - это то место, где раньше было x[96] и т. Д.

Нет простого способа заставить GDB интерпретировать эти данные как локальные fn.

1 голос
/ 25 сентября 2019

Стек-кадры не содержат никакой информации о его размере или границах, скорее эти знания жестко закодированы в коде функций.Имеется регистр указателя кадра (стека), использование которого позволяет поднимать стек вверх, но не вниз.В текущей функции вы знаете границы текущего кадра, но нет информации о том, что может быть ниже него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...