我们如何轮询堆栈状态 - 未使用(可用)内存

Jon*_*ong 5 c windows winapi stack

我们怎样才能获得这些信息?我想这是依赖于操作系统的,我正在运行Windows所以我的问题是指Windows API.

是否有任何函数可以为我们做 - 为调用线程获取剩余的堆栈内存?

或者,如果我们能够找到以下详细信息,我们将能够自行计算:

  1. 获取线程堆栈基址.必须有一些函数将线程标识符作为参数,并返回一些有关它的信息(例如...堆栈基址?)
  2. 获取线程堆栈大小.如果线程是由我们启动的,我们就可以知道它(因为我们在调用时指定了它CreateThread).但是如果它是主要线程,它是由操作系统为我们的程序启动的,或者我们没有明确启动的任何其他线程,我们如何找到它?
  3. 获取当前堆栈指针.嗯,那更容易.我们可以检查它esp,或者获取局部变量的地址,以获得一个接近的位置.

这是出于教育目的,但我想它可以用来阻止递归算法导致堆栈溢出 - 而不是使用任何最大深度限制功能.

wj3*_*j32 5

你可以使用NtCurrentTeb(),它可以获得指向TEB的指针.这有NT_TIB作为其第一个成员:

typedef struct _NT_TIB
{
     PEXCEPTION_REGISTRATION_RECORD ExceptionList;
     PVOID StackBase;
     PVOID StackLimit;
     PVOID SubSystemTib;
     // ....
} NT_TIB, *PNT_TIB;
Run Code Online (Sandbox Code Playgroud)

  • 线程环境块(http://msdn.microsoft.com/en-us/library/windows/hardware/ms686708)从我错过的NT_TIB ... :-( (2认同)