准备使用 UMDH

在使用用户模式转储堆(UMDH)捕获进程的堆分配之前,必须先完成本节中所述的配置任务。 如果未正确配置计算机,UMDH 将不会生成任何结果,或者结果不完整或不正确。

创建用户模式堆栈跟踪数据库

在使用 UMDH 捕获进程的堆分配之前,必须将 Windows 配置为捕获堆栈跟踪。

若要为进程启用堆栈跟踪捕获,请使用 GFlags 为进程设置 创建用户模式堆栈跟踪数据库 标志。 这可以通过以下任一方法完成:

  • 在 GFlags 图形界面中,选择“ 图像文件 ”选项卡。键入进程名称,包括文件扩展名(例如,Notepad.exe)。 按 Tab 键,选择“创建用户模式堆栈跟踪数据库”,然后选择“应用”。

  • 或者,同样,请使用以下 GFlags 命令行,其中 ImageName 是进程名称(包括文件扩展名):

    gflags /i ImageName +ust

默认情况下,Windows 收集的堆栈跟踪数据量限制为 x86 处理器上的 32 MB,x64 处理器上的堆栈跟踪数据数限制为 64 MB。 如果必须增大此数据库的大小,请在 GFlags 图形界面中选择“图像文件 ”选项卡,键入进程名称,按 TAB 键,选中 “堆栈回溯”(Megs) 复选框,在关联的文本框中键入值(以 MB 为单位),然后选择“ 应用”。

请注意 ,仅在必要时增加此数据库,因为它可能会耗尽有限的 Windows 资源。 当不再需要更大的大小时,将此设置返回到其原始值。

这些设置会影响程序的所有新实例。 它不会影响当前正在运行的程序实例。

访问必要的符号

在使用 UMDH 之前,必须有权访问应用程序的正确符号。 UMDH 使用环境变量_NT_SYMBOL_PATH指定的符号路径。 将此变量设置为等于包含应用程序符号的路径。

如果还包括 Windows 符号的路径,则分析可能更完整。 此符号路径的语法与调试器使用的语法相同;有关详细信息,请参阅 符号路径

例如,如果应用程序的符号位于 C:\MyApp\Symbols,并且已将 Windows 符号文件安装到 \\myshare\winsymbols,则可以使用以下命令设置符号路径:

set _NT_SYMBOL_PATH=c:\myapp\symbols;\\myshare\winsymbols

另一个示例是,如果应用程序的符号位于 C:\MyApp\Symbols,并且想要使用 Windows 符号的公共Microsoft符号存储(使用 C:\MyCache 作为下游存储),则可以使用以下命令设置符号路径:

set _NT_SYMBOL_PATH=c:\myapp\symbols;srv*c:\mycache*https://msdl.microsoft.com/download/symbols

重要 说明:有两台计算机: 在其中创建 UMDH 日志的日志记录计算机分析 UMDH 日志的分析计算机 。 分析计算机上的符号路径必须指向生成日志时在日志记录计算机上加载的 Windows 版本的符号。 不要将分析计算机上的符号路径指向符号服务器。 如果这样做,UMDH 将检索在分析计算机上运行的 Windows 版本的符号,并且 UMDH 不会显示有意义的结果。

禁用 BSTR 缓存

自动化(以前称为 OLE 自动化)缓存 BSTR 字符串使用的内存。 这可以防止 UMDH 正确确定内存分配的所有者。 若要避免此问题,必须禁用 BSTR 缓存。

若要禁用 BSTR 缓存,请将 OANOCACHE 环境变量设置为 1(1)。 在启动要跟踪其分配的应用程序之前,必须进行此设置。

或者,可以通过调用 .NET Framework SetNoOaCache 函数从应用程序本身中禁用 BSTR 缓存。 如果选择此方法,应尽早调用此函数,因为调用 SetNoOaCache已缓存的任何 BSTR 分配都将保持缓存状态。

如果需要跟踪服务进行的分配,必须将 OANOCACHE 设置为系统环境变量,然后重启 Windows,使此设置生效。

查找进程 ID

UMDH 通过其进程标识符(PID)来标识进程。 可以使用任务管理器、任务列表或 TList 查找任何正在运行的进程的 PID。