Каково точное содержимое стека программ на C? - PullRequest
1 голос
/ 22 июня 2010

Я хочу знать точное содержимое стека программ.

Как выполняется операция ветвления?

Что означает дамп памяти при отладке программы с помощью gdb?

Дает ли он программный стек?

TIA, Praveen

Ответы [ 3 ]

3 голосов
/ 22 июня 2010

Сам язык Си не требует использования стека вообще - он определяет поведение, а не реализацию.

Однако в общем случае программный стек используется для хранения нескольких вещей:

  • Объекты, объявленные с auto сроком хранения (т. Е. Обычные, не static локальные переменные);
  • Параметры функции;
  • Адрес возврата (место в коде, где выполнение должно возобновиться после достижения return; или окончания текущей функции);
  • Память, выделенная нестандартной функцией alloca();
  • Временные значениятребуемые компилятором, такие как сохраненное содержимое регистров, служебная информация для alloca(), размер массивов переменной длины и промежуточные значения, используемые в вычислениях.

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

«Отладка» в отладчике показывает часть (но не все) содержимогостек.

2 голосов
/ 22 июня 2010

Стек - это область памяти, в которой содержатся аргументы подпрограмм, локальные переменные и адреса возврата из подпрограмм.

На многих архитектурах, включая Intel, стек растет сверху вниз - это означает, что указатель стека уменьшаетсякаждый раз, когда данные помещаются в стек.

Типичная последовательность вызовов функций будет выглядеть следующим образом:

  • Push-аргументы
  • Перейти к подпрограмме (которая выдвигаетадрес возврата в стек)
  • В некоторых языках (например, Pascal) базовый указатель помещается в стек.
  • Вызываемая подпрограмма выделяет место в стеке для своих локальных переменных.

Чтобы произвести трассировку стека, среда выполнения просто сканирует стек, чтобы определить, куда указывают адреса возврата.Я написал «просто», но не все так просто, если базовые указатели не были сохранены в стеке, потому что было бы невозможно определить, где находятся какие-либо кадры стека, кроме текущего.

0 голосов
/ 22 июня 2010

см. Ссылку ниже, которая может дать вам лучшую идею Переменные и память

он дает трассировку стека до того, как произойдет повреждение памяти. Эта трассировка стека представляет собой последовательность вызовов функций, которые были сделаны вместе с переданными аргументами.

...