ログ比較の解釈

同じプロセスの複数のユーザー モード ダンプ ヒープ (UMDH) ログを時間の経過と同時に生成できます。 次に、UMDH を使用してログを比較し、評価版間で最も大きくなった呼び出し履歴の割り当てを判断できます。

たとえば、次のコマンドは、2 つの UMDH ログ (Log1.txtとLog2.txt) を比較するように UMDH に指示し、出力を 3 番目のファイル (Compare.txt) にリダイレクトします。

umdh -v Log1.txt Log2.txt > Compare.txt

結果のCompare.txt ファイルには、各ログに記録された呼び出し履歴が一覧表示され、スタックごとに、ログ ファイル間のヒープ割り当ての変更が表示されます。

たとえば、ファイルの次の行は、"Backtrace00053" というラベルが付いた呼び出し履歴内の関数の割り当てサイズの変化を示しています。

Log1.txtでは、スタック内の呼び出しは 40,432 (0x9DF0) バイトを占めますが、Log2.txtでは、同じ呼び出し履歴が 61,712 (0xF110) バイトを占め、21,280 (0x5320) バイトの差を占めます。

+ 5320 (f110 - 9df0) 3a allocs BackTrace00053 
Total increase == 5320

割り当てのスタックを次に示します。

ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D

呼び出し履歴を調べると、LeakyFunc 関数が Visual C++ ランタイム ライブラリを使用してメモリを割り当てられていることが示されています。 他のログ ファイルを調べると、割り当てが時間の経過と同時に増加することが示されている場合は、ヒープから割り当てられたメモリが解放されていないと結論付けることができます。

ログ ファイルを分析するためのシンボル ファイル

たとえば、UMDH ログを作成するログを記録するコンピューターと、UMDH ログを分析する分析コンピューターの 2 つのコンピューターがあるとします。 分析コンピューターのシンボル パスは、ログが作成された時点でログ コンピューターに読み込まれた Windows のバージョンのシンボルを指している必要があります。 分析コンピューター上のシンボル パスをシンボル サーバーにポイントしないでください。 その場合、UMDH は分析コンピューターで実行されている Windows のバージョンのシンボルを取得し、UMDH には意味のある結果が表示されません。

参照

UMDH を使用したユーザーモード メモリ リークの検出