2012-02-08 15 views
2

私はWinDBGでメモリダンプを調べていますが、なぜヒープに2つの空きがあるのだろうと思っていますSystem.Threading.ThreadAbortExceptionsどちらも空です。ヒープに2つの空のThreadAbortExceptionsがあるのはなぜですか?

  1. System.ExecutionEngineException

  2. System.StackOverflowException

  3. System.OutOfMemoryException

:他の三つの場合

は、彼らが存在し、それらがデフォルトで作成されていることを、なぜ私は理解して例外を発見しました

WinDBGの出力

0:!000> dumpheap型System.Threading.ThreadAbortException

Address  MT  Size 
010210fc 79330ef8  72  
01021144 79330ef8  72  
total 2 objects 

Statistics: 
MT Count TotalSize Class Name 
79330ef8  2   144 System.Threading.ThreadAbortException 

Total 2 objects 

0:!000> PE 010210fc

Exception object: 010210fc 
Exception type: System.Threading.ThreadAbortException 
Message: <none> 
InnerException: <none> 
StackTrace (generated):<none> 
StackTraceString: <none> 
HResult: 80131530 

0:000> !pe 01021144

Exception object: 01021144 
Exception type: System.Threading.ThreadAbortException 
Message: <none> 
InnerException: <none> 
StackTrace (generated): <none> 
StackTraceString: <none> 
HResult: 80131530 

だから私の質問は次のようになります。

  1. これら二つは、デフォルトで作成されています - もしそうなら - なぜ二人はあるのですか?
  2. そうでない場合、なぜそれらは空ですか?

メモリダンプはWindowsサービスからのものです。ダンプ

0からスレッド情報と

アップデート:000>スレッド

ThreadCount: 14 
UnstartedThread: 0 
BackgroundThread: 8 
PendingThread: 0 
DeadThread: 4 
Hosted Runtime: no 
PreEmptive GC Alloc   Lock 

ID OSID ThreadOBJ State  GC  Context  Domain Count APT Exception 
0 1 11d4 0015c538  a020 Enabled 00000000:00000000 00163aa0  0 MTA 
2 2 71c 0016f6a0  b220 Enabled 00000000:00000000 00163aa0  0 MTA (Finalizer) 
3 4 1914 0019ac48 180b220 Enabled 6a205b0c:6a207910 00163aa0  0 MTA (Threadpool Worker) 
5 6 1bd4 001b1580 200b020 Enabled 00000000:00000000 00163aa0  0 MTA 
6 7 16a4 001bd260 200b220 Enabled 6a1dc7b8:6a1dd910 00163aa0  0 MTA 
7 8 870 001c4a58 200b220 Enabled 6a1da740:6a1db910 00163aa0  0 MTA 
8 9 2204 001cf798  b220 Enabled 00000000:00000000 00163aa0  0 MTA 
9 d 4d8 0021cb98 80a220 Enabled 00000000:00000000 00163aa0  0 MTA (Threadpool Completion Port) 
10 e 1b70 002227c0 200b220 Enabled 6a27d820:6a27d910 00163aa0  0 MTA 
11 89 2224 68a3fbd0 880b220 Enabled 00000000:00000000 00163aa0  0 MTA (Threadpool Completion Port) 
XXXX 11 0 2336e658 8801820 Enabled 00000000:00000000 00163aa0  0 Ukn (Threadpool Completion Port) 
XXXX 46 0 16d17270 8801820 Enabled 00000000:00000000 00163aa0  0 Ukn (Threadpool Completion Port) 
XXXX 3a 0 16ca7a70 8801820 Enabled 00000000:00000000 00163aa0  0 Ukn (Threadpool Completion Port) 
XXXX 3b 0 10e64250 8801820 Enabled 00000000:00000000 00163aa0  0 Ukn (Threadpool Completion Port) 
+0

あなたはいくつのコアを持っていますか?アクティブなスレッドごとに1つあります。いくつかのスレッドを作成して、もう一度見てください。 –

+0

@HenkHoltermanもこれについて考えました。仮想マシンには4つのコアと!スレッドがあり、スレッド数は14です。!treads情報で質問を更新しました。 –

答えて

5

彼らはCLRによって事前に割り当てられています!。

// If creating a normal ThreadAbortException fails, due to OOM or StackOverflow, 
// use a pre-created one. 
// We do not won't to change a ThreadAbortException into OOM or StackOverflow, because 
// it will cause recursive call when escalation policy is on: 
// Creating ThreadAbortException fails, we throw OOM. Escalation leads to ThreadAbort. 
// The cycle repeats. 
throwable = GetPreallocatedThreadAbortException(); 

同じファイル、CLRException:CLR/SRC/VM/clrex.cpp、CLRException :: GetThrowable()から

:私はCLRのSSCLI20バージョンからこれらのスニペットは話をしてもらおう:: GetPreallocatedRudeThreadAbortException()メソッド:

// When we are hosted, we pre-create this exception. 
// This function should be called only if the exception has been created. 
_ASSERTE(g_pPreallocatedRudeThreadAbortException); 
return ObjectFromHandle(g_pPreallocatedRudeThreadAbortException); 

いくつかの説明を使用することができます "サイクルが繰り返される":OutOfMemoryException例外 - > Thread.Abort() - >新しいThreadAbortExceptionの() - >のOutOfMemoryException - > Thread.Abort()を。 Etcetera。

同じソースファイルには、全く同じ理由でGetPreallocatedOutOfMemoryException()、GetPreallocatedStackOverflowException()、およびGetPreallocatedExecutionEngineException()もあります。

+0

非常に役に立ちます。ありがとう! –

+1

さて、なぜ2つの*があるのですか? – svick

+0

スレッドアボートは、失礼なアボートを引き起こす可能性があります。 –

関連する問題