文章编号: 268343 - 最后修改: 2007年4月25日 - 修订: 10.2 Umdhtools.exe: 如何使用 Umdh.exe 查找内存泄漏本页概要用户模式转储堆 (UMDH) 瀹炵敤宸 ュ 叿一起鎿嶄綔绯荤粺分析特定进程的 Windows 堆分配。 此实用工具和其他相关联,工具主要针对 Windows 2000 和 Windows XP。 单击 播放 按钮观看此流媒体演示。
注意 因为 malloc 函数 C 运行时 (CRT) 模块中的使用原始的发行版本的 Windows Server 2003 上的框架指针省略 (FPO),您可能无法通过使用 UMDH 工具中看到 malloc 函数的完整堆栈信息。 此问题被固定的 Windows Server 2003 Service Pack 1 (SP1) CRT 模块中。 因此,您可以看到 malloc 函数在 Windows Server 2003 SP1 中的完整堆栈信息。 更多信息之前使用 UMDH如果您认为您遇到内存泄漏,则应注意的内存泄漏可能不是它们似乎是。 您可能发现内存泄漏不是真正的内存泄漏,而是性能增强。 渚嬪 Microsoft Jet 数据库引擎可以占用大量内存 (最多 256 MB 的计算机上的 128 MB) 由于检索数据,并将写入缓存。 缓存允许 Jet 引擎,以获取快速预读和写预缓冲。若要确定进程遇到内存泄漏,使用 Windows 性能监视器 (Perfmon.exe) 和监视您的应用程序进程类别下的专用字节数。 专用字节数是进程已分配但不是与其他进程共享的内存总量。 请注意这是不同的虚拟字节这也是监视有趣。 虚拟字节是以字节为单位的进程使用的虚拟地址空间的当前大小。 应用程序可以泄漏虚拟内存,但可能无法看到中专用字节分配的差异。 如果您看不到内存增加监视专用字节,但您怀疑正在仍然运行的内存不足时,监视查看如果您正在使用簡铏氭嫙鍐呭瓨虚拟字节数。 鏈夊叧检测内存泄漏和 Windows 性能监视器 (Perfmon.exe) 概述璇疯闂笅闈 ㈢ 殑 Microsoft 缃戠珯锛 http://msdn.microsoft.com/en-us/library/ms404355.aspx
(http://msdn.microsoft.com/en-us/library/ms404355.aspx)
若要确保您的应用程序正在泄漏内存,将可疑代码放在带有许多迭代循环中,然后监视任何增加内存的专用和虚拟字节。 监视以确保专用字节数和虚拟字节数不会不最终保持相同,并且数量停止增加。 如果在其中内存停止增加,一个点 (渚嬪它不会继续无限期地达到) 您看不到内存泄漏,但更可能的方式是您看到增长至其最大尺寸的缓存。如果您决定您看到内存泄漏之前使用 UMDH,,请按照下列步骤操作:
http://www.microsoft.com/whdc/devtools/ddk/default.mspx
(http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
下载和安装该实用工具,然后设置 PATH 系统环境变量到路径已在安装调试工具。 才您使用 UMDH 您必须安装正确的调试符号的应用程序和操作系统组件。 使用 Microsoft 符号服务器获取的 Microsoft 组件的调试符号。 有关 Microsoft 符号服务器的详细信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 311503?
(http://support.microsoft.com/kb/311503/
)
使用 Microsoft 符号服务器获取调试符号文件 UMDH 将尝试使用 _NT_SYMBOL_PATH 环境变量来查找符号文件。 要从命令提示符设置路径命令可能看起来类似以下内容: 设置 _NT_SYMBOL_PATH = SRV * c:\LocalSymbolCache 有关设置符号调试信息的其他信息,请参阅本文后面的调试符号一节。完成这些步骤之后,您就可以使用 UMDH 实用程序。 捕获堆转储带有 UMDHUMDH 是一种实用工具,它将转储在堆分配一个进程的有关信息。 此信息包括调用堆栈的每个分配,通过该调用堆栈,进行的分配数和消耗通过该调用堆栈的字节数。 例如:若要产生堆分配的转储文件,必须让知道所需跟踪分配鍐呮牳鎿嶄綔绯荤粺使用也是为 Windows 调试工具的产品中包含 Gflags.exe 实用程序。 假设您要为 Notepad.exe 转储 heap(s) 内容。 首先,您必须启用您要测试该应用程序的堆栈跟踪购置。 榛樿鎯呭喌涓嬶,未启用此功能。 命令来启用此功能是,如下所示: gflags-i notepad.exe + ust 该命令不能启用已运行的进程的堆栈跟踪,但它使 Notepad.exe 的所有将来执行的堆栈跟踪。 或者,您可以通过 GFLAGS 用户界面 (不带任何参数来获取用户界面中运行 Gflags.exe) 设置该标志。 使用该 -ust gflags 禁用堆栈跟踪,完成时的选项调试。 设置通过 Gflags.exe,图像标志,并设置调试符号时您就可以启动记事本 (在使用 UMDH 的应用程序)。 在程序启动后,您必须确定该进程 ID (PID) 只需启动记事本过程。 此命令是,如下所示: tlist 您可以找到 PID 从 TLIST 应用程序的输出。 PID 信息也可获得从任务管理器。 假定您只需启动记事本进程的 PID 是 124。 UMDH 可用于获取堆转储,使用以下命令: umdh-p: 124-f:notepad124.log 结果: Notepad124.log 文件中已有记事本过程的一个完整堆转储。 此文件显示了所做的分配和该 callstacks 的所有已在进行分配。 使用比较 UMDH 日志的 Umdh.exeUMDH 日志文件包含有关一个进程的堆的当前状态的有价值的信息,如果您担心与查找内存泄漏时, 可能要比较的两个日志的输出,并找出哪些调用堆栈已看到两个转储文件之间最大增长更有价值。 Umdh.exe 实用程序有助于比较两个 UMDH 日志,以提供分析它们之间区别。 后两种不同的时间间隔捕获的日志可以使用以下命令:UMDH dh1.log dh2.log > cmp12.txt -或者- UMDH-d dh1.log dh2.log > cmp12.txt -d 命令行选项将告诉 UMDH 十进制,而不是十六进制显示。 命令的输出进行比较的两种日志之间分配差异,并提供类似于以下信息: + 5320 (f110-9df0) 增加 3a allocs BackTrace00053 总计 = = 5320 用于 UMDH 的日志文件中的每个 BackTrace,没有两个日志文件之间进行比较。 此例显示了 UMDH command line 中指定在最后一个日志文件有 0xF110 分配时 UMDH 命令行中的第一个日志 0x9DF0 的字节数为同一 BackTrace 分配的字节数 (调用堆栈)。 "5320"是分配的字节数中差异。 在本例中没有的 0x5320 两种日志已捕获时间时间之间分配更多的字节数。 将字节来自标识的"BackTrace00053"调用堆栈。 下一步是找出该 backtrace 中。 濡傛灉鎵撳紑第二个日志文件和 BackTrace00053 的搜索可能会发现某些东西就类似于以下内容: 启用堆栈跟踪UMDH 日志中最重要的信息是在堆栈跟踪堆分配。 您可以分析这些验证一个进程是否泄漏堆内存。 榛樿鎯呭喌涓嬶,不会获取这些堆栈跟踪。 您可以启用此功能,每个进程或系统范围。 若要启用堆栈跟踪系统使用以下命令:gflags-r + ust 此命令后,重新启动计算机。 对于每个进程启用,该命令的是,如下所示: gflags-i APPNAME + ust 其中 APPNAME 是包括扩展名 (傦 Services.exe、 Lsass.exe) 可执行文件的文件名。 该命令不能启用已运行的进程的堆栈跟踪。 因此的 (对于示例、 服务、 lsass、 winlogon 中) 不能重新启动的进程必须重新启动您的测试计算机。 浣跨敤浠 ヤ 笅鍛戒护确认系统范围或特定进程已经设置了什么设置: 系统范围内: gflags-r 特定进程: gflags-i APP NAME 榛樿鎯呭喌涓嬶,最大堆栈跟踪深度为 16。 如果您要查看更深 callstacks,您可以增加这通过运行 GFLAGS。 单击以选择 系统注册表,然后 Max 中键入新的深度。 堆栈跟踪捕获深度 编辑控件。 单击 应用,然后重新启动计算机。 要点: 如果使用的 Windows NT 4.0 服务包 6,您必须使用 Umdh_nt4.exe,而不是 Umdh.exe,并且必须使用 gflags r 命令设置系统范围堆栈跟踪。 纭繚閲嶆柊鍚姩璁 $ 畻鏈恒。 Umdh_nt4 堆栈跟踪每个进程来在 Windows NT 版本 4 上不起作用。 必须将它设置为整个系统。 调试符号使用 UMDH 最重要的步骤之一是确保您具有良好的符号文件 (.dbg 或.pdb 文件) 以获得良好的堆栈跟踪。 一个至少需要将 Kernel32.dbg 和 Ntdll.dbg 符号文件。 您可以获取您可能需要为找出更多的附加调试符号关于哪些组件泄漏内存。 有关如何获取信息调试符号文件的 Microsoft 组件,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:311503?
(http://support.microsoft.com/kb/311503/
)
使用 Microsoft 符号服务器获取调试符号文件 鏈夊叧濡備綍浣跨敤 Microsoft 符号服务器以及如何获得 Windows 的符号包请访问下面的 Microsoft 网站: http://www.microsoft.com/whdc/devtools/ddk/default.mspx
(http://www.microsoft.com/whdc/devtools/ddk/default.mspx)
在生成 Visual c + + 的组件时, 非常重要您不具有程序数据库以进行编辑并继续选择了在 c + + 编译器选项。 而是,选择程序数据库。 若要设置符号路径,初始化 _NT_SYMBOL_PATH 环境变量来使用路径。 您可以使用 Microsoft 符号服务器获取符号为 Microsoft 组件。 311503?
(http://support.microsoft.com/kb/311503/
)
使用 Microsoft 符号服务器获取调试符号文件 璇锋寜鐓 т 笅鍒楁楠 ゆ 搷浣滐设置 _NT_SYMBOL_PATH 环境变量:
注意: 参阅包括到您的应用程序的组件的 pdb 路径。 渚嬪将 _NT_SYMBOL_PATH 的路径设置为下列: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\myapplicationssymbols 此路径的第一部分指向 Microsoft 符号服务器,并指出使用的符号将被下载 c:\symbols 文件夹中。 随后将分号的部分是对 PDB 文件路径 (符号文件) 专为泄漏的应用程序。 调用 UMDHUMDH 的唯一的所需命令行参数是在 -p 指定从中获得堆转储的进程的 PID 的选项。 可以使用任务管理器或 Tlist.exe 程序获得 PID。 对于类似于下列某个命令到标准输出转储日志:umdh-p: PID UMDH 还显示到标准错误的各种信息性消息,因此如果不重定向其,它混合与真实的日志。 要收集 UMDH 信息性消息,在文件中的,使用以下命令: umdh-p: PID 2>umdh.msg 如果想收集由 UMDH 文件中转储的日志使用下列命令之一: umdh-p: PID > umdh.log -或者- umdh-p: PID-f:umdh.log 这些命令是等效的。 通过 UMDH 获得默认的日志包含由分配计数排序的堆消费者的枚举。 如果出于调试目的,您还需要所有与它们对应的堆栈跟踪已分配块的转储文件,可使用 -d 选项: umdh-p: PID d 如果您使用此命令,则可能会看到在 UMDH 中的下列日志文件: 跟踪 BackTrace00046 的分配: 005F69A0 005F6150 如果在日志中包含太多的信息可以是仅限于具有所分配的大用户计数超出特定阈值。 使用以下命令: umdh-p: PID-t: 阈值 所有命令行选项 (渚嬪 -p、-f、-t、-d) 指定同时按任何顺序。 以下是更难的命令行示例: umdh-p: 123-t: 1000-f:umdh.log d 此命令转储到 Umdh.log 的文件与 PID 123 进程的堆。 它将转储只为 1000 个以上的分配和它的帐户还转储的每个堆栈跟踪通过分配在堆块地址的堆栈跟踪。 另一个有用的 UMDH 选项是在 -l 选项。 这会导致在尽可能调用堆栈中打印的文件和行号。 解释 UMDH 输出如果该日志被重定向到一个文件 (umdh-p: PID-f:umdh.log),内容是类似于以下内容从正在运行的记事本进程获得:您可以体验使用 UMDH 时的问题最常见的错误时使用 UMDH 发生,因为没有启用堆栈跟踪。 此外,不正确的符号 Ntdll.dll 阻止 UMDH 的运行。 将其他符号文件 UMDH 运行,但在日志文件包含不具有函数名称但相反必须在模块内的相对地址的堆栈跟踪。 远距离的第三个错误正在指定错误 PID。 下面的错误消息结果当您尝试执行的进程的运行 UMDH 不具有堆栈启用跟踪:C:\>umdh-p: 1140 UMDH: Logtime 2000-06-28 12: 43-机 = MyMachine-PID = 1140年连接.....模块枚举完成。 SymGetSymFromName(process, ntdll!RtlpStackTraceDataBase, xxx) 失败 LastError = 126 UmdhGetAddrFromName 找不到堆栈跟踪 DB 指针 (ntdll! RtlpStackTraceDataBase)。 ntdll.dll 符号不正确 ; 我们必须能够看到非导入符号。 gflags-i APPNAME 当您依赖于系统范围堆栈跟踪,请使用以下命令: gflags-r 这些命令显示为应用程序设置的标志的列表。 请注意在系统范围堆栈跟踪的情况下该功能可能会显示为活动但如果运行 gflags-r + ust 命令后,您确实不重新启动计算机,它不实际激活。 如果您想要知道已启用的堆栈跟踪每个应用程序,您可以查看以下注册表项下的 USTEnabled 注册表项: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image 文件执行选项 如果已启用的堆栈跟踪的进程上运行 UMDH,但您没有重新启动应用程序由于设置标志您可能会在您的日志中收到以下消息: 堆栈跟踪而未保存的此分配 (索引 = = 0) ntsd 记事本 然后,从调试器控制台运行 LD 命令以加载模块的符号信息,并列出什么模块已加载它们符号 LM 命令。 如果 LM 命令的输出显示加载的导出符号,符号不是很好。 濡傛灉鎮 ㄦ 湁加载 PDB 符号在符号是很好。 如果指定了错误的 PID 您可能会收到以下错误消息: C:\>umdh-p: 1000 UMDH: Logtime 2000-06-28 09: 45-机 = MyMachine-PID = 1000年连接... OpenProcess 失败 LastError = 0x57 从 Visual Basic 调用 UMDH它可能很有用,有时会随着时间的推移转储的日志数量,因为该泄漏可能不是很明显首次。 渚嬪如果您怀疑您的活动服务器页 (ASP) Web 应用程序正在泄漏内存,它可能有助于 UMDH shells 的 Visual Basic 中写入一个 COM 组件。 可以从 ASP 页,然后调用该组件。下面是一些 Visual Basic 代码的调用 UMDH 并创建基于当前时间的日志文件: 与 Windows NT 4.0 Service Pack 6a 使用 UMDH (SP6a)在 Windows NT 4.0,附带的 Windows 产品调试工具 UMDH 实用程序将不起作用。 自解压可执行文件 (Umdhnt4tools.exe) 随本文,包含要与 NT 4.0 一起使用以下工具:
收起这个图片 ![]() 有关如何下载 Microsoft 的支持文件的详细信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: 119591?
(http://support.microsoft.com/kb/119591/
)
濡備綍鑾峰彇 Microsoft 的支持文件从联机服务 Microsoft 扫描此文件的病毒。 Microsoft 使用该文件的过帐日期上可用的最新病毒检测软件。 该文件存储在安全性得到增强的服务器,以帮助防止未经授权的任何更改对该文件。 将 Umdh_nt4.exe 和 Dbghelp.dll 放在一个文件夹,然后首先将它们放在您 PATH 环境变量中。 使用 Umdh_nt4.exe 而不是 UMDH。 正在运行 Windows NT 4.0 璁 $ 畻鏈轰笂您必须使用 Gflags.exe 设置系统范围堆栈跟踪。 例如: gflags-r 纭繚閲嶆柊鍚姩璁 $ 畻鏈恒。 Umdh_nt4 堆栈跟踪每个进程来在 Windows NT 4.0 版本上不起作用。 它是为整个系统中进行设置。 UMDH_NT4 是与 UMDH 不同的因为它不比较日志文件。 渚嬪您不能执行下列操作: UMDH_NT4 dh1.log dh2.log > cmp12.txt 您必须使用本文中包含 Dhcmp.exe 实用程序。 该命令看起来类似于以下: DHCMP dh1.log dh2.log > cmp12.txt 这篇文章中的信息适用于:
机器翻译注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。 点击这里察看该文章的英文版: 268343?
(http://support.microsoft.com/kb/268343/en-us/
)
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。 | 文章翻译
|

回到顶端

