启用堆数据捕获
当收集捕获 HeapAlloc 和 HeapRealloc 事件的堆栈时,进程堆分析最有效。 若要使用符号对堆栈进行解码,必须启用符号解码。 可以在启动进程时或者在现有进程中捕获堆数据。
在启动进程时启用数据捕获
此示例将启动正在从用于启动数据捕获的命令行序列进行分析的进程。 在启动进程时启用数据捕获可保证不会丢失分配信息或历史记录。 执行以下步骤以在启动进程时启用数据捕获:
在提升的命令提示符下键入以下命令:
xperf -on Base -BufferSize 1024 -MinBuffers 10 -MaxBuffers 16
下面是一个命令示例:
xperf -start HeapSession -heap -PidNewProcess "C:\Program Files\Windows Sidebar\sidebar.exe" -BufferSize 1024 -MinBuffers 128 -MaxBuffers 128 -stackwalk HeapAlloc+HeapRealloc
边栏会在桌面上打开。
下表介绍了这些命令。
命令 说明 -start HeapSession
初始化跟踪会话或记录器会话。 在这种情况下,该会话名为“HeapSession”。
-heap
将“HeapSession”标识为堆跟踪。
-PidNewProcess
初始化进程。 在这种情况下,将初始化 Windows 边栏。
-BufferSize
设置存储事件数据的缓冲区的缓冲区大小。 缓冲区的最佳大小为 1024 KB。 默认值为 64 KB。
-MinBuffers
设置事件数据存储的最小缓冲区数。 MinBuffers 应等于 MaxBuffers,以保证跟踪之间的一致性。
-MaxBuffers
请谨慎分配 MaxBuffers,因为缓冲区是从非分页内存(有限系统资源)分配的。
-stackwalk
初始化 stackwalk 工具以收集分配和释放信息,并将该信息与特定线程相关联。
HeapAlloc+HeapRealloc
标识 stackwalk 工具捕获并显示的特定堆事件。
键入下列命令:
xperf -stop -stop HeapSession -d HeapTrace.etl
-d HeapTrace.etl
命令可将会话中生成的跟踪合并到 HeapTrace.etl 文件中。
在现有进程上启用数据捕获
此选项将启用数据捕获,而无需停止并重新启动进程。 如果在应用程序启动后仍不会出现所分析的场景,这可能比较有用,而且不需要初始堆分配(可能生成非常大的跟踪文件)。
执行以下步骤:
在提升的命令提示符下,使用 BASE 标记启动 NT 内核记录器,如下所示:
xperf -on BASE
若要在现有进程中启用堆跟踪,请将以下命令中的 XXX 替换为实际的进程 ID:
xperf -start HeapSession -heap -Pid XXX -BufferSize 1024 -MinBuffers 128 -MaxBuffers 128 -stackwalk HeapAlloc+HeapRealloc
以启动进程时进行数据捕获的相同方式准备要分析的跟踪:
xperf -stop -stop HeapSession -d heapTrace.etl