-
Notifications
You must be signed in to change notification settings - Fork 0
MS_UMDH
nishi_74322014 edited this page Aug 3, 2026
·
1 revision
-
TOP > トラブルシュート > 障害対応に使用するツールの一覧
- WinDbg
- UMDH
UMDH:User Mode Dump Heap
- プロセスのスレッドのヒープの使用状況のログを取得できる。
- このログを比較することで、どのスタックトレースがメモリ・リークに関係しているかを絞り込むことができる。
- Java や .NET のマネージ・リソースのメモリ・リークは検出できないことがあるので注意する。
- これは、マネージド・ヒープがガベージ・コレクタによって管理されているため。
※ 逆に言うと、UMDH が有効なのは アンマネージド(Win32 ヒープ)のリーク。
マネージド側は .NETのメモリ・リーク の SOS / dotnet-gcdump を使う。
- Debugging Tools for Windows に同梱されているためこれをインストールする。
-
ntdll.dllとバージョンの一致するシンボル・ファイルが必要になるため、
_NT_SYMBOL_PATH環境変数にシンボル サーバとキャッシュ・フォルダを設定する。
SRV*c:\websymbols*https://msdl.microsoft.com/download/symbols
- また、グローバルフラグを使用してユーザモード スタックトレース データベースの
作成を有効にする必要がある。 - ユーザモード スタックトレース データベースはメモリを使用するため、調査後には無効にする。
- グローバルフラグの有効・無効化には、Global Flags Editor(
gflags.exe)ユーティリティを使用する
(Debugging Tools for Windows に同梱されている)。- CUI
- 有効化:
gflags -i <実行ファイル名> +ust - 無効化:
gflags -i <実行ファイル名> -ust
- 有効化:
- GUI
Image File タブから、対象イメージの
create user mode stack trace database チェックボックスを有効・無効にする。
- CUI
※ +ust は次回起動時から有効になる。既に動いているプロセスには効かない。
アプリケーションを動作させ、プロセスのヒープの使用状況のログを取得する。
umdh.exe -p:<プロセスID> -f:<ログファイル名>
※ リーク調査では、時間をおいて 2 回以上取得する(例:起動直後と数時間後)。
プロセスのヒープの使用状況のログ分析
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 - ログ前後の増加バイト数
// NEW_BYTES - ログ2のバイト数
// OLD_BYTES - ログ1のバイト数
// COUNT_DELTA - ログ前後の割り当て回数の増分
// NEW_COUNT - ログ2の割り当て数
// OLD_COUNT - ログ1の割り当て数
// TRACEID - トレース データベース内のスタック トレースの10進インデックス
出力例(+ の増分が大きいもの=割り当てサイズ・回数が大きいものに注目する)。
+ 74736 ( 154363 - 79627) 124 allocs BackTrace3C ★ 増分に注目
+ 36 ( 124 - 88) BackTrace3C allocations
ntdll!RtlDebugAllocateHeap+000000E1 ★ スタックトレースはサマリ情報
ntdll!RtlAllocateHeapSlowly+00000044 詳しくはログ・ファイル内を
ntdll!RtlAllocateHeap+00000E64 TRACEID をキーに確認する
MSVCR80!CExclusiveLock::CExclusiveLock+0000001A
移行メモ(正誤): 原文は
NEW_COUNT/OLD_COUNTの説明が どちらも「ログ前後の割り当て数」となっていたが、NEW_COUNTは後(ログ2)の、OLD_COUNTは前(ログ1)の割り当て数。 上表のとおりに改めた。
補足:
RtlDebugAllocateHeapがスタックの先頭に出るのは、 ページ ヒープ/デバッグ ヒープが有効な状態であることを示す。 本番の性能影響が大きいため、調査後はgflags -i <exe> -ust -hpaで必ず戻す。
Tags: インフラストラクチャ, Windows, 障害対応, 性能, デバッグ, ツール類
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。