获取当前使用的堆栈大小为win7
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取当前使用的堆栈大小为win7相关的知识,希望对你有一定的参考价值。
是否有一个用于GetCurrentThreadStackLimits的windows7函数,它似乎仅适用于windows> = 8? [1]和 - 如果不是 - 我怎么能在win 7上获得这个信息?
我需要找到当前使用堆栈大小的线程。 (使用了stacksize!=最大堆栈大小)
谢谢!
PS:用于诊断目的。我们需要找到为stm32应用程序保留的堆栈大小,我只想让pc模拟工作。
[1]:在调用该函数时,程序会编译,但在运行时会弹出一个消息框,上面写着“在kernel32.dll中找不到函数入口点”文档声明这个函数需要windows8:https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadstacklimits
我需要找到当前使用堆栈大小的线程。 (使用了stacksize!=最大堆栈大小)
在这种情况下,GetCurrentThreadStackLimits
完全错误的功能,因为它返回分配的堆栈大小。所以最大限度地堆叠可能的堆栈大小。但通常大部分内存都是保留的,但尚未分配。如果你想要精确使用的堆栈大小 - 你需要从NT_TIB
读取它
void GetCurrentThreadUsedStackLimits(PULONG_PTR LowLimit, PULONG_PTR HighLimit )
{
NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
*HighLimit = (ULONG_PTR)tib->StackBase;
*LowLimit = (ULONG_PTR)tib->StackLimit;
}
HighLimit
将与返回GetCurrentThreadStackLimits
相同,但LowLimit
通常会有所不同 - GetCurrentThreadStackLimits
返回堆栈的分配基数(所以它可能是最大的大小,当NT_TIB.StackLimit
当前被分配堆栈限制(可以增长)
如果你想要GetCurrentThreadStackLimits
的实现功能(但请注意 - 它不会返回最大堆栈大小。你可以做下一步:
ULONG GetCurrentThreadStackLimits_old( _Out_ PULONG_PTR LowLimit, _Out_ PULONG_PTR HighLimit )
{
static void (WINAPI* GetCurrentThreadStackLimits)(PULONG_PTR , PULONG_PTR);
if (!GetCurrentThreadStackLimits)
{
*(void**)&GetCurrentThreadStackLimits = GetProcAddress(GetModuleHandle(L"kernel32"), "GetCurrentThreadStackLimits");
if (!GetCurrentThreadStackLimits)
{
NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
*HighLimit = (ULONG_PTR)tib->StackBase;
MEMORY_BASIC_INFORMATION mbi;
if (VirtualQuery(tib->StackLimit, &mbi, sizeof(mbi)))
{
*LowLimit = (ULONG_PTR)mbi.AllocationBase;
return 0;
}
return GetLastError();
}
}
GetCurrentThreadStackLimits(LowLimit, HighLimit);
return 0;
}
所以我们首先尝试从GetCurrentThreadStackLimits
获取"kernel32"
的地址。可能并在这里使用"api-ms-win-core-processthreads-l1-1-1"
而不是"kernel32"
。如果我们得到系统上载函数指针 - 使用它。如果没有(win7 - ) - 你自己查询这个限制
我发现了一个令人惊讶的“快速而肮脏”的解决方案。 (这很明显)
它只是在函数中声明一个局部变量并获取该变量的地址:
uint GetCurrentStackAdress()
{
uint aDummy;
return reinterpret_cast<uint>(&aDummy);
}
这应该适用于大多数系统我认为和我的诊断目的它足够脏;-)。
以上是关于获取当前使用的堆栈大小为win7的主要内容,如果未能解决你的问题,请参考以下文章
Android 使用两个不同的代码片段获取当前位置 NULL