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

时间:2012-01-27 03:37:57

标签: c# .net multithreading

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

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

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

我知道理想情况下,不需要知道这些或设置这些,但看起来它与堆栈大小相关,因为它可以从console / powershell(命令行应用程序)而不是来自UI。

备注(以下帖子有点相关。但它没有回答我的问题。可能会给出一些指导意见)

Maximum Thread Stack Size .NET?

要获得有关实际问题的更多信息:

StackOverFlowException: Is it programming error (recursion) or not enough maximum default stack size?

2 个答案:

答案 0 :(得分:5)

从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。

答案 1 :(得分:2)

获取此信息实际上是一个真正的PITA:

  1. 使用GetCurrentThreadId
  2. 获取主题ID
  3. 使用OpenThread获取线程的句柄
  4. 现在使用NtQueryInformationThread获取有关该主题的信息。您将ThreadBasicInformation用作THREADINFOCLASS来获取THREAD_BASIC_INFORMATION结构。您现在拥有TebBaseAddress参数,该参数是线程环境块的地址。
  5. TebBaseAddress地址读入进程内存。
  6. 线程环境块(TEB)中,您可以访问StackLimit属性,这是您正在寻找的值。
  7. 从第3步开始,它没有记录。这就是我不建议检索此信息的原因。