准备使用 UMDH

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

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

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

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

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

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

    gflags /iImageName+ust

默认情况下,Windows 收集的堆栈跟踪数据量在 x86 处理器上限制为 32 MB,在 x64 处理器上限制为 64 MB。 如果必须增加此数据库的大小,请在 GFlags 图形界面中选择“图像文件”选项卡,键入进程名称,按 TAB 键,检查“Stack Backtrace (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,并且你想要将公共 Microsoft 符号存储用于 Windows 符号(使用 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。