如何查找当前线程';s.net中的最大堆栈大小
本文关键字:net 大堆栈 何查找 查找 线程 前线 | 更新日期: 2023-09-27 18:21:29
如何找到当前线程的最大堆栈大小?
在从MMC UI而不是从Powershell(命令行/控制台)执行函数时,我遇到了堆栈溢出异常。因此,我猜测这与UI线程中分配给Powershell(命令行/控制台)的默认堆栈大小有关。
那么如何找到当前线程的最大堆栈大小呢?
我知道理想情况下不需要知道或设置这些,但看起来它与堆栈大小有关,因为它是从控制台/Powershell(命令行应用程序)而不是从UI工作的。
下面的线索有点相关,但它不能回答我的问题;它可能给出了一些指导方针:
最大线程堆栈大小.NET?
获取有关实际问题的更多详细信息:
StackOverFlowException:是编程错误(递归)还是没有足够的最大默认堆栈大小?
在Windows 8中,有GetCurrentThreadStackLimits()函数。你可以从C#通过PInvoke使用它,如下所示:
[DllImport("kernel32.dll")]
static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);
uint low;
uint high;
GetCurrentThreadStackLimits(out low, out high);
var size = (high - low) / 1024; // in KB
在我的机器上,这在控制台应用程序中产生1MB,在web应用程序(IIS)中产生256KB。
获取这些信息实际上是一个真正的PITA:
- 使用GetCurrentThreadId获取线程ID
- 使用OpenThread获取线程的句柄
- 现在使用NtQueryInformationThread获取有关线程的信息。您将使用
ThreadBasicInformation
作为THREADINFOCLASS
来获得THREAD_BASIC_INFORMATION
结构。现在您有了TebBaseAddress
参数,它是线程环境块的地址 - 在
TebBaseAddress
地址读取进程内存 - 在线程环境块(TEB)中,您可以访问
StackLimit
属性,这是您要查找的值
从第3步开始,它是未记录的。这就是为什么我不建议检索这些信息。