Как мы можем опросить статус стека - неиспользуемая (доступная) память

Как мы можем получить эту информацию? Я предполагаю, что это зависит от ОС, и я использую Windows, поэтому мой вопрос относится к API Windows.

Есть ли какая-нибудь функция, которая может сделать это за нас - получить оставшуюся стековую память для вызывающего потока?

В качестве альтернативы, если мы сможем выяснить следующие детали, мы сможем вычислить это самостоятельно:

  1. Получите базовый адрес стека потока . Должна быть какая-то функция, которая принимает идентификатор потока в качестве параметра и возвращает некоторую информацию о нем (например, ... Базовый адрес стека?)
  2. Получить размер стека потока . Если поток был запущен нами, мы можем это узнать (поскольку мы указали его при вызове CreateThread ). Но если это основной поток, который был запущен ОС для нашей программы, или любой другой поток, который мы не запускали явно, как его найти?
  3. Получить текущий указатель стека . Что ж, так проще. мы можем либо проверить его с помощью esp , либо взять адрес локальной переменной, чтобы получить точное местоположение.

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

5
задан Jong 30 December 2011 в 19:40
поделиться