2012-01-27 78 views
5

我如何找到當前線程的最大堆棧大小?如何在.net中查找當前線程的最大堆棧大小?

我得到一個堆棧溢出異常,而執行從MMC UI功能,但不能從Powershell的(命令行/控制檯)。所以我有點猜測它與UI線程中分配的默認堆棧大小與Powershell(命令行/控制檯)中的默認堆棧大小有關。

因此,如何找到當前線程的最大堆棧大小?

我知道最好一個犯規需要知道這些或設置這些,但看起來像它涉及到堆棧大小,因爲它從控制檯/ PowerShell中(命令行應用程序)的作品不是從UI。

債券(以下線程樣的關係,但它不回答我的問題很可能提供了一些指導。)

Maximum Thread Stack Size .NET?

要獲取有關實際問題的更多deails:

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

回答

2

獲取此信息實際上是一個真正的PITA:

  1. 使用GetCurrentThreadId
  2. 使用OpenThread獲得的句柄線程
  3. 現在使用NtQueryInformationThread獲取有關線程的信息獲取線程ID。您將使用ThreadBasicInformation作爲THREADINFOCLASS以獲得THREAD_BASIC_INFORMATION結構。您現在有TebBaseAddress參數,它是線程環境塊的地址。
  4. 閱讀過程內存在TebBaseAddress地址。
  5. 線程環境塊(TEB)中,您可以訪問StackLimit屬性,該值屬於您正在查找的值。

從步驟3,它的無證。這就是爲什麼我不建議檢索這些信息。

1

在Windows 8,有GetCurrentThreadStackLimits()功能。您可以從C#通過的PInvoke這樣使用它:

[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在控制檯應用程序,256KB的Web應用程序(IIS)。