Skip to content

MS_UMDH

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

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 チェックボックスを有効・無効にする。

+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, 障害対応, 性能, デバッグ, ツール類

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally