2012-01-27 24 views
5

どのようにして現在のスレッドの最大スタックサイズを見つけることができますか?現在のスレッドの最大スタックサイズを.netで見つける方法は?

MMC UIではなくPowerShell(コマンドライン/コンソール)からの関数の実行中にスタックオーバーフロー例外が発生します。だから私は、PowerShell(コマンドライン/コンソール)のUIスレッドに割り当てられているデフォルトのスタックサイズと何かを推測しています。

現在のスレッドの最大スタックサイズを見つけるにはどうすればよいですか?

これらを知っている必要はありませんが、これらを設定する必要はありませんが、UIからではなくconsole/powershell(コマンドラインアプリケーション)のようにスタックサイズに関連しているようです。

ノート(スレッドの下の種類の関連しているが、それは私の質問に答えdoesntの、おそらくいくつかのガイドラインを提供します。。)

Maximum Thread Stack Size .NET?

実際の問題の詳細deails取得するには:

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

答えて

2

この情報を取得することは、実際のP​​ITAです。

  1. は今のスレッドについての情報を取得するためにNtQueryInformationThreadを使用したスレッド
  2. へのハンドルを取得するためにGetCurrentThreadId
  3. 使用OpenThreadを使用してスレッドIDを取得します。 THREAD_BASIC_INFORMATION構造を取得するにはThreadBasicInformationTHREADINFOCLASSとして使用します。 スレッド環境ブロックのアドレスであるTebBaseAddressパラメータがあります。
  4. TebBaseAddress番地のプロセスメモリを読み込みます。
  5. スレッド環境ブロック(TEB)内では、あなたが探している値であるStackLimitプロパティにアクセスできます。

手順3以降、文書化されていません。だから私はこの情報を取得することをお勧めしません。

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 

、これはコンソールアプリケーション、Webアプリケーション(IIS)で256キロバイトが1MBを生み出します。

関連する問題