トラックの仮想メモリがVMMapでは使用できません。

VMMapは、システム内の優れたツールですが、それは、特定のプロセスの仮想メモリを可視化し、助けにメモリの使用を理解することができます。これは、スレッド・スタック、特定のレポートの画像、Win32のヒープとGCヒープを持っています。時には、VMMapレポートは、メモリ使用可能なさまざまな仮想メモリに使用されることはありません。ここでVMMap報告例の32ビットプロセス(仮想メモリの2ギガバイトの合計)です。

 

 

この「利用できない」メモリは、なぜ使用しないから来るの?Windows仮想メモリマネージャは、64キロバイトの粒度分布を有しています。VirtualAllocのは、メモリを割り当てると、以下64キロバイト未満(例えば16キロバイト等)64キロバイト境界上VirtualAllocのリターンアドレスを必要とする場合、直接。そして、最初の4ページ(16キロバイト)、未使用としてマークされ、残りの48キロバイトを分配しました。リターンアドレスVirtualAllocのは、常に64キロバイトの境界上に存在するので、このメモリは、別の割り当てを行うことによって得ることができません。さて、このメモリは使用できません。
問題のVMMapの断片化ビューは、より明白です。イエロードットは4KBの領域であり、以下のスクリーンショットでは、それが割り当てられて使用され、グレーの長方形は、60キロバイトの領域で使用することができないことができます。これらのアドレス空間の領域全体が利用できないときは、仮想メモリがそんなにあなたが考えるほどではありません取得します。

 

 

幸いなことに、それが違法配信のソースを見つけるのは簡単です。基本的に、我々は、割り当てサイズを探している小さい64キロバイト以上である(またはより良い:あなたは64キロバイトの平均で割り切れることはできません)VirtualAllocのを呼び出します。あなたはまた、WinDbgのセットブレークポイントを添付することができ、これらの割り当てを追跡するためにVMMap自体(それはトラッキングモードを持っている)を使用することができます。

0:000> !BM kernelbase VirtualAllocの* "R $ T0 = POI(@ ESP + 8); .IF(!@ $ T0%0x10000番地= 0){.printf \"使用不可メモリが割り当てた後に出てくる%Dバイト\」 、@ $ T0; KB 4} .ELSE {GC}」 
  !1:76c03e8a @ "KERNELBASE VirtualAllocExNuma" 
  !2:76bcd532 @ "KERNELBASE VirtualAllocの" 
  !3:76c03e66 @ "KERNELBASE VirtualAllocEx" 
0:000> G 
使用不可メモリはバイト4096を割り当てた後出てくる
子供にChildEBP RetAddr Argsの               
010a4e34 00000000 00001000 00003000 KERNELBASE!VirtualAllocの00defd48 
00defe2c 010a5f25 00000000 00000000 7eaa7000 FourKBLeak!allocate_small + 0x34の
00deff18 010a6989 00000001 012ba870 012bae98 FourKBLeak!メイン+ 0x35の 
00deff68 010a6b7d 00deff7c 7529919f 7eaa7000 FourKBLeak!__ tmainCRTStartup + 0x199

このブレークポイントは、サイズ分布が64キロバイトVirtualAllocのを割り切れてもよいことを保証するために渡されます。それ以外の場合は、ブレークポイントが停止し、問題の割り当てとコールスタックを出力します。それ以外の場合は、それが継続されます。これは、ソースの小さな割り当てが非常に容易になり、それらを修正することが期待されてキャプチャします。

おすすめ

転載: www.cnblogs.com/yilang/p/12033563.html