「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>障害対応に使用するツールの一覧]]

* 目次 [#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

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



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS