【问题标题】:How to find current thread's max stack size in .net?如何在.net中找到当前线程的最大堆栈大小?
【发布时间】:2012-02-20 04:04:21
【问题描述】:

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

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

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

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

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

Maximum Thread Stack Size .NET?

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

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

【问题讨论】:

    标签: c# .net multithreading


    【解决方案1】:

    从 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】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-27
        • 2011-11-24
        • 2012-12-31
        • 2014-01-20
        • 2010-09-15
        • 2010-10-30
        • 2013-02-07
        • 2019-03-13
        相关资源
        最近更新 更多