如何找到当前线程的最大堆栈大小?
我在从MMC UI执行函数时遇到堆栈溢出异常,但不是从Powershell(命令行/控制台)执行。所以我猜测它与UI线程中分配的默认堆栈大小有关,与Powershell(命令行/控制台)中的默认堆栈大小有关。
那么如何找到当前线程的最大堆栈大小?
我知道理想情况下,不需要知道这些或设置这些,但看起来它与堆栈大小相关,因为它可以从console / powershell(命令行应用程序)而不是来自UI。
备注(以下帖子有点相关。但它没有回答我的问题。可能会给出一些指导意见)
Maximum Thread Stack Size .NET?
要获得有关实际问题的更多信息:
答案 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:
ThreadBasicInformation
用作THREADINFOCLASS
来获取THREAD_BASIC_INFORMATION
结构。您现在拥有TebBaseAddress
参数,该参数是线程环境块的地址。TebBaseAddress
地址读入进程内存。StackLimit
属性,这是您正在寻找的值。从第3步开始,它没有记录。这就是我不建议检索此信息的原因。