文章编号: 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 (SP 1) 的 CRT 模块中。 因此,您可以看到 malloc 函数在 Windows Server 2003 SP 1 中的完整的堆栈信息。 更多信息之前使用 UMDH如果您认为您遇到内存泄漏时,就要知道内存泄漏可能无法在显示为。 您可能会发现不是真正的内存泄漏,内存泄漏,而是性能增强。 是例如 Microsoft Jet 数据库引擎会消耗大量内存 (最多 256 MB 的计算机上的 128 MB) 因为它检索数据并写入缓存。 缓存允许将快速预读并且写预缓冲 Jet 引擎。若要确定进程遇到内存泄漏,可使用 Windows 性能监视器 (Perfmon.exe) 和监视进程类别下的专用字节为您的应用程序。 专用字节数是进程已经分配但不是与其他进程共享的内存总数。 请注意这是不同于虚拟的字节数这也是要监视的有趣。 虚拟字节数是以字节进程使用虚拟地址空间当前大小。 应用程序可能泄漏虚拟内存,但可能无法看到专用字节可以分配的差异。 如果看不内存增加您监视专用的字节数,但您怀疑您仍在运行 Out of memory 时请监视以查看是否使用虚拟内存的虚拟字节。 有关检测内存泄漏和概述的 Windows 性能监视器 (Perfmon.exe) 的其他信息,请访问下面的 Microsoft Web 站点: 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 Symbol Server 获取调试符号的 Microsoft 组件。 有关 Microsoft Symbol Server 的详细信息,单击下面的文章编号,以查看 Microsoft 知识库中的文章: 311503?
(http://support.microsoft.com/kb/311503/
)
使用 Microsoft Symbol Server 获取调试符号文件 UMDH 尝试通过使用 _ NT _ SYMBOL _ PATH 环境变量查找符号文件。 命令从命令提示符处设置路径可能类似于下面: 设置 _ NT _ SYMBOL _ PATH = SRV * c:\LocalSymbolCache 有关设置符号调试信息请参阅本文后面的"调试符号"一节 (英文)。完成这些步骤后,现在可以使用 UMDH 实用工具。 捕获堆转储与 UMDHUMDH 是一个进程的堆分配的信息将转储实用工具。 此信息包括在调用堆栈,为每个分配、 通过该调用堆栈,进行的分配的数量和通过该调用堆栈使用的字节数。 例如:若要生成转储文件的堆分配,必须让知道您希望在内核跟踪分配的操作系统中使用它也是随 Debugging Tools for Windows 产品,Gflags.exe 实用工具。 假设您要为 Notepad.exe 转储 heap(s) 内容。 首先必须启用堆栈跟踪获取要测试的应用。 默认,不启用此功能。 该命令以启用此功能如下所示: 在命令行键入以下命令:<a0>gflags-i notepad.exe + ust 该命令不会启用堆栈跟踪都已运行的进程,但它启用所有将来执行 Notepad.exe 的堆栈跟踪。 此外,您可以通过 GFLAGS 用户界面 (不带任何参数获得用户界面中运行 Gflags.exe) 设置标志。 使用在 -ust 选项禁用堆栈跟踪,完成后的在命令行键入以下命令:<a0>gflags 调试。 当您设置通过 Gflags.exe,图像标记,并且您设置调试符号时,您就可以启动记事本 (应用程序正在使用 UMDH 的)。 在启动该程序后,您必须确定进程 ID (PID) 只需启动记事本进程。 此命令如下所示: tlist 您可以找到 tlist 应用程序的输出中 PID。 PID 信息还可以获得从任务管理器。 假定只需启动记事本进程 PID 是 124。 可以使用 UMDH 获取堆转储使用以下命令: umdh-p: 124-f:notepad124.log 结果 : 您 Notepad124.log 文件中有完整的堆转储记事本进程。 此文件显示所有的分配在 callstacks 做分配。 使用 Umdh.exe 向比较 UMDH 日志而如果您担心使用查找内存泄漏,UMDH 日志文件包含进程的堆的当前状态的重要信息,则可能是比较两个日志的输出,并了解哪些调用堆栈发生两个的转储文件之间最大的增长更重要。 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 中。 如果您打开第二个日志文件 nds earchf or BackTrace00053 ,您会可能会发现内容,类似于以下: 启用堆栈跟踪UMDH 日志中的,最重要信息是堆栈跟踪的堆分配。 您可以分析其验证进程是否泄漏堆内存。 默认,不被获取这些堆栈跟踪。 您可以启用此功能,每个进程或系统范围。 使用下面的命令启用堆栈跟踪系统范围内: 在命令行键入以下命令:<a0>gflags-r + ust 此命令后重新启动计算机。 对于每个进程启用,命令如下所示: 在命令行键入以下命令:<a0>gflags-i APPNAME + ust 其中 APPNAME 是包括扩展名 (如,Services.exe、 Lsass.exe) 可执行文件的文件名。 该命令不会启用已运行的进程的堆栈跟踪。 因此的 (例如,服务,Lsass,Winlogon) 无法重新启动的进程必须重新启动您的测试计算机。 使用以下命令来确认系统范围或特定进程的已经设置了哪些设置: 系统范围内: 在命令行键入以下命令:<a0>gflags-r 特定进程: 在命令行键入以下命令:<a0>gflags-i APP NAME 默认,最大的堆栈跟踪深度为 16。 如果想要查看更深入的 callstacks,可以通过运行 GFLAGS 增加此。 单击以选中 系统注册表 ,然后键入 最大值中的新的深度。 堆栈跟踪捕获深度编辑控件。 单击 应用 ,并重新启动计算机。 重要说明 : 如果要使用 Windows NT 4.0 Service Pack 6 中,必须使用 Umdh_nt4.exe,而不是 Umdh.exe,而且您必须使用 在命令行键入以下命令:<a0>gflags r 命令设置系统级的堆栈跟踪。 请确保在重新启动计算机。 在 Windows NT 版本 4 上每个过程根据无效 Umdh_nt4 堆栈跟踪。 它必须设置为整个系统。 调试符号使用 UMDH 最重要的措施之一是确保您具有正确的符号文件 (.dbg 或.pdb 文件) 将一个很好的堆栈跟踪。 一个至少需要 Kernel32.dbg 和 Ntdll.dbg 的符号文件。 您可以获得其他您可能需要您了解更多的调试符号有关哪些组件泄漏内存。 有关如何获取 Microsoft 调试符号文件组件,单击下面的文章编号,以查看 Microsoft 知识库中的文章:311503?
(http://support.microsoft.com/kb/311503/
)
使用 Microsoft Symbol Server 获取调试符号文件 有关如何使用 Microsoft Symbol Server 以及如何获取 Windows 符号程序包的其他信息,请访问下面的 Microsoft Web 站点: 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 Symbol Server 组件。 311503?
(http://support.microsoft.com/kb/311503/
)
使用 Microsoft Symbol Server 获取调试符号文件 请按照下列步骤设置 _ NT _ SYMBOL _ PATH 环境变量:
注意 : 包含应用程序的组件的 PDB 该路径。 是例如设置 _ NT _ SYMBOL _ PATH 的路径为以下: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\myapplicationssymbols 此路径在第一个部件将指向 Microsoft Symbol Server,并指出使用的符号将下载 c:\symbols 文件夹中。 分号的部分是 PDB 文件路径 (符号文件) 专门为泄漏的应用程序。 调用 UMDH在只需要命令行参数 UMDH 是在 -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) 失败,LastErr = 126 UmdhGetAddrFromName 无法查找堆栈跟踪数据库指针 (Ntdll! RtlpStackTraceDataBase)。 Ntdll.dll 符号不正确 ; 我们必须能够看到非导入的符号。 在命令行键入以下命令:<a0>gflags-i APPNAME 如果您依赖于系统范围内的堆栈跟踪,请使用以下命令: 在命令行键入以下命令:<a0>gflags-r 这些命令显示标记为应用程序的列表。 请注意在系统范围内的堆栈跟踪的情况下的功能可能显示为活动但如果您未做运行 在命令行键入以下命令:<a0>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 失败,LastErr = 0x57 从 Visual Basic 中调用 UMDH可能是有用有时会随着时间的推移转储日志的一个数,因为此泄漏不可能非常明显一开始。 是例如如果您怀疑您的 Active Server Pages (ASP) Web 应用程序正在泄漏内存,可能很有帮助在 shells 出的 Visual Basic 中的 COM 组件写入 UMDH。 可以从 ASP 页,然后调用该组件。下面是一些 Visual Basic 代码调用 UMDH,并创建基于当前时间的一个日志文件: 使用 Windows NT 4.0 Service Pack 6a 的 UMDH (SP 6 a)在 Windows NT 4.0 无效随 Debugging Tools for 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 设置系统级的堆栈跟踪。 例如: 在命令行键入以下命令:<a0>gflags-r 请确保在重新启动计算机。 在进程按 Windows NT 4.0 上无效 Umdh_nt4 堆栈跟踪。 将设置为整个系统。 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和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。 | 文章翻译
|


回到顶端

