Могу ли я получить пределы стека в C/С++?
Мой вопрос довольно прост и прост: если у меня есть, например, 1 МБ ОЗУ, назначенной стеку программ, могу ли я получить адреса начала и конца, или начало и длину?
Я использую Visual Studio 2013.
Ответы
Ответ 1
Вы должны задать вопрос о своих предположениях о расположении стека.
Может быть в стеке нет только одного верхнего и нижнего уровня
Возможно, у него нет фиксированного дна вообще
Ясно, что нет портативного способа запроса понятий, которые не являются переносимыми.
Из Visual С++, однако, вы можете использовать Win32 API, в зависимости от версии Windows.
В Windows 8 это очень просто, просто позвоните GetCurrentThreadStackLimits
Более ранние версии должны использовать VirtualQueryEx
и обрабатывать результаты несколько. Получение одного адреса в стеке легко, просто используйте &
для локальной переменной. Затем вам нужно найти пределы зарезервированного региона, который включает этот адрес. Джо Даффи написал сообщение в блоге, в котором показаны детали поиска нижнего адреса стека
Ответ 2
GetCurrentThreadStackLimits
похоже, делает то, что вы ищете, получая нижние/верхние границы стека в адрес указателя:
ULONG_PTR lowLimit;
ULONG_PTR highLimit;
GetCurrentThreadStackLimits(&lowLimit, &highLimit);
Похоже, он доступен только для Windows 8 и Server 2012.
Проверьте MSDN
Ответ 3
В Windows до 8 реализовать GetCurrentThreadStackLimits() самостоятельно:
#include <windows.h>
#if _WIN32_WINNT < 0x0602
VOID WINAPI GetCurrentThreadStackLimits(LPVOID *StackLimit, LPVOID *StackBase)
{
NT_TIB *tib = (NT_TIB *) NtCurrentTeb();
*StackLimit = tib->StackLimit;
*StackBase = tib->StackBase;
}
#endif