マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

UMDH:User Mode Dump Heap

  • プロセスのスレッドのヒープの使用状況のログを取得できる。
  • このログを比較することで、どのスタックトーレスがメモリ・リークに関係しているかを絞り込むことができる。
  • javaや.netのマネージ・リソースのメモリ・リークは検出できないことがあるので注意する。
  • これは、マネージド・ヒープがガベージ・コレクタによって管理されているため。

準備

  • Debugging Tools for Windowsに同梱されているためこれをインストールする。
  • ntdll.dllとバージョンの一致するシンボル・ファイルが必要になるため、
    _NT_SYMBOL_PATH環境変数にシンボル サーバとキャッシュ・フォルダを設定する
    (SRV*c:\websymbols*http://msdl.microsoft.com/download/symbolsなど)。
  • また、グローバルフラグを使用して
    ユーザモード スタックトレース データベース
    の作成を有効にする必要がある。
  • ユーザモード スタックトレース データベースは
    メモリを使用するため、調査後には無効にする。
  • グローバルフラグの有効・無効化には、
    Global Flags Editor (Gflags.exe) ユーティリティを使用する。
    (Debugging Tools for Windowsに同梱されている)
  • CUI
    • 有効化:gflags -i <実行ファイル名> +ust
    • 無効化:gflags -i <実行ファイル名> -ust
  • GUI
    ImageFile?タブから、対象イメージの
    create user mode stack trace databaseチェックボックスを有効・無効にする。

ログ取得

アプリケーションを動作させ、プロセスのヒープの使用状況のログを取得

umdh.exe -p:<プロセスID> -f:<ログファイル名>

ログ分析

プロセスのヒープの使用状況のログ分析

umdh.exe <ログファイル1> <ログファイル2> > <リダイレクト先ファイル>

これにより2つのログの差分情報がリダイレクト先ファイルに出力される。

以下のヘッダーはそのままヘルプになっている。

// Each log entry has the following syntax:                                 
//                                                                          
// + BYTES_DELTA (NEW_BYTES - OLD_BYTES) NEW_COUNT allocs BackTrace TRACEID ★ → この情報がスレッド毎に表示される。
// + COUNT_DELTA (NEW_COUNT - OLD_COUNT) BackTrace TRACEID allocations      
//     ... stack trace ...                                                  
//                                                                          
// where:                                                                   
//                                                                          
//     BYTES_DELTA - increase in bytes between before and after log(ログ前後の増加バイト数。)
//     NEW_BYTES - bytes in after log(ログ2のバイト数)
//     OLD_BYTES - bytes in before log(ログ1のバイト数)
//     COUNT_DELTA - increase in allocations between before and after log(ログ前後の割り当て回数)
//     NEW_COUNT - number of allocations in after log(ログ前後の割り当て数)
//     OLD_COUNT - number of allocations in before log(ログ前後の割り当て数)
//     TRACEID - decimal index of the stack trace in the trace database
//         (can be used to search for allocation instances in the original UMDH logs).

+   74736 ( 154363 -  79627)    124 allocs BackTrace3C ★ → +の増分(割り当てサイズ・回数が大きいものに注目)
+      36 (    124 -     88)               BackTrace3C allocations

ntdll!RtlDebugAllocateHeap+000000E1 ★ → スタックトレースはサマリ情報なので、詳しくは、ログ・ファイルの中を、TRACEID をキーにして確認する。
ntdll!RtlAllocateHeapSlowly+00000044
ntdll!RtlAllocateHeap+00000E64
MSVCR80!CExclusiveLock::CExclusiveLock+0000001A

+    2048 (   2048 -      0)      1 allocs BackTrace321
+       1 (      1 -      0)               BackTrace321 allocations

ntdll!RtlDebugAllocateHeap+000000E1
ntdll!RtlAllocateHeapSlowly+00000044
ntdll!RtlAllocateHeap+00000E64
MSVCR80!CSecurityManager::MapUrlToZoneEx2Internal+000001D2
MSVCR80!CUrlMon::SetIUri+00000074
MSVCR80!CEnumFmtEtc::Next+0000005C
MSVCR80!IsStatusOk+00000012
MSVCR80!CINetHttp::ErrorHandlingRequest+00000019
MSVCR80!CSecurityManager::CheckMKURL+00000038
MSVCR80!CIEApplicationAssociation::GetMimeFromExt+000000E7
MSVCR80!CIEApplicationAssociation::GetExtFromMime+00000039

+     576 (    704 -    128)     22 allocs BackTrace318
+      18 (     22 -      4)               BackTrace318 allocations

ntdll!RtlDebugAllocateHeap+000000E1
ntdll!RtlAllocateHeapSlowly+00000044
ntdll!RtlAllocateHeap+00000E64
ntdll!RtlpAllocateDebugInfo+00000049
ntdll!RtlInitializeCriticalSectionAndSpinCount+000000A9
kernel32!InitializeCriticalSectionAndSpinCount+00000015
MSVCR80!CTransaction::~CTransaction+000001E7
MSVCR80!CSoftDist::GetSoftwareUpdateInfo+000000FC
MSVCR80!StringCchCopyExW+00000177
MSVCR80!CIEApplicationAssociation::GetExtFromMime+00000039

+     544 (   1152 -    608)     36 allocs BackTrace30D
+      17 (     36 -     19)               BackTrace30D allocations

ntdll!RtlDebugAllocateHeap+000000E1
ntdll!RtlAllocateHeapSlowly+00000044
ntdll!RtlAllocateHeap+00000E64
ntdll!RtlpAllocateDebugInfo+00000049
ntdll!RtlInitializeCriticalSectionAndSpinCount+000000A9
kernel32!InitializeCriticalSectionAndSpinCount+00000015
MSVCR80!CTransaction::~CTransaction+000001E7
MSVCR80!StringCchPrintfA+00000022
MSVCR80!CEnumFmtEtc::Next+0000005C
MSVCR80!IsStatusOk+00000012
MSVCR80!CINetHttp::ErrorHandlingRequest+00000019
MSVCR80!CSecurityManager::CheckMKURL+00000038
MSVCR80!CIEApplicationAssociation::GetMimeFromExt+000000E7
MSVCR80!CIEApplicationAssociation::GetExtFromMime+00000039

+      32 (     32 -      0)      1 allocs BackTrace322
+       1 (      1 -      0)               BackTrace322 allocations

ntdll!RtlDebugAllocateHeap+000000E1
ntdll!RtlAllocateHeapSlowly+00000044
ntdll!RtlAllocateHeap+00000E64
ntdll!RtlpAllocateDebugInfo+00000049
ntdll!RtlInitializeCriticalSectionAndSpinCount+000000A9
kernel32!InitializeCriticalSectionAndSpinCount+00000015
MSVCR80!CTransaction::~CTransaction+000001E7
MSVCR80!CTransaction::DispatchReport+0000032C
MSVCR80!CINetHttp::HttpNegGetRootSecurityId+00000062
MSVCR80!CEnumFmtEtc::Next+0000005C
MSVCR80!IsStatusOk+00000012
MSVCR80!CINetHttp::ErrorHandlingRequest+00000019
MSVCR80!CSecurityManager::CheckMKURL+00000038
MSVCR80!CIEApplicationAssociation::GetMimeFromExt+000000E7
MSVCR80!CIEApplicationAssociation::GetExtFromMime+00000039

参考


Tags: :インフラストラクチャ, :Windows, :障害対応, :性能, :デバッグ, :ツール類


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-01-16 (火) 16:22:30 (673d)