如何查找当前线程';s.net中的最大堆栈大小

本文关键字:net 大堆栈 何查找 查找 线程 前线 | 更新日期: 2023-09-27 18:21:29

如何找到当前线程的最大堆栈大小?

在从MMC UI而不是从Powershell(命令行/控制台)执行函数时,我遇到了堆栈溢出异常。因此,我猜测这与UI线程中分配给Powershell(命令行/控制台)的默认堆栈大小有关。

那么如何找到当前线程的最大堆栈大小呢?

我知道理想情况下不需要知道或设置这些,但看起来它与堆栈大小有关,因为它是从控制台/Powershell(命令行应用程序)而不是从UI工作的。

下面的线索有点相关,但它不能回答我的问题;它可能给出了一些指导方针:

最大线程堆栈大小.NET?

获取有关实际问题的更多详细信息:

StackOverFlowException:是编程错误(递归)还是没有足够的最大默认堆栈大小?

如何查找当前线程';s.net中的最大堆栈大小

在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:

  1. 使用GetCurrentThreadId获取线程ID
  2. 使用OpenThread获取线程的句柄
  3. 现在使用NtQueryInformationThread获取有关线程的信息。您将使用ThreadBasicInformation作为THREADINFOCLASS来获得THREAD_BASIC_INFORMATION结构。现在您有了TebBaseAddress参数,它是线程环境块的地址
  4. TebBaseAddress地址读取进程内存
  5. 线程环境块(TEB)中,您可以访问StackLimit属性,这是您要查找的值

从第3步开始,它是未记录的。这就是为什么我不建议检索这些信息。