[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>障害対応に使用するツールの一覧]] * 目次 [#fd1ecf8f] #contents *概要 [#p76302e0] UMDH:User Mode Dump Heap -プロセスのスレッドのヒープの使用状況のログを取得できる。 -このログを比較することで、どのスタックトーレスが[[メモリ・リーク]]に関係しているかを絞り込むことができる。 -javaや.netのマネージ・リソースの[[メモリ・リーク]]は検出できないことがあるので注意する。 -これは、マネージド・ヒープがガベージ・コレクタによって管理されているため。 *準備 [#q3ec8b8c] -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チェックボックスを有効・無効にする。 *ログ取得 [#r6305ceb] アプリケーションを動作させ、プロセスのヒープの使用状況のログを取得 umdh.exe -p:<プロセスID> -f:<ログファイル名> *ログ分析 [#adc32308] プロセスのヒープの使用状況のログ分析 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 *参考 [#n99fd04b] -リークが発生します [Umdhtools.exe] Umdh.exe を使用して、メモリを検索する方法~ http://support.microsoft.com/kb/268343/ja -Help needed regarding UMDH Log~ http://social.msdn.microsoft.com/Forums/en-us/windowsgeneraldevelopmentissues/thread/813ad272-4ea1-4c63-90fe-43e4bda92375