如何在.NET中查找当前线程的最大堆栈大小?

6

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

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

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

我知道理想情况下不需要了解或设置这些内容,但是似乎与堆栈大小有关,因为它可以从控制台/Powershell(命令行应用程序)中工作,而不是从UI中工作。

下面的线程有点相关,但它没有回答我的问题;它可能提供了一些指导:

.NET的最大线程堆栈大小?

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

StackOverFlowException:它是编程错误(递归)还是默认堆栈大小不足?

2个回答

6
自Windows 8开始,有一个名为 GetCurrentThreadStackLimits() 的函数可用。您可以通过PInvoke从C#中使用它,如下所示:
[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。

2
获取这些信息实际上很麻烦:
  1. 使用GetCurrentThreadId获取线程ID。
  2. 使用OpenThread获取线程句柄。
  3. 现在使用NtQueryInformationThread获取关于线程的信息。你将使用ThreadBasicInformation作为THREADINFOCLASS来获取THREAD_BASIC_INFORMATION结构。现在你有了TebBaseAddress参数,它是线程环境块的地址。
  4. 读取TebBaseAddress地址处的进程内存。
  5. 线程环境块(TEB)中,你可以访问StackLimit属性,这就是你要查找的值。
从第3步开始,这是未经记录的。这就是为什么我不建议检索此信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接