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

Dre*_*mer 6 .net c# multithreading

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

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

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

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

注释(下面的线程有点相关.但它没有回答我的问题.可能会给出一些指导)

最大线程堆栈大小.NET?

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

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

小智 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
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这在控制台应用程序中产生1MB,在Web应用程序(IIS)中产生256KB。


ken*_*n2k 2

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

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

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