解释日志比较结果

随着时间的推移,可以生成多个User-Mode转储堆 (UMDH) 同一进程的日志。 然后,可以使用 UMDH 来比较日志,并确定在试用之间增长最大的调用堆栈分配。

例如,以下命令指示 UMDH 比较两个 UMDH 日志(Log1.txt和Log2.txt),并将输出重定向到第三个文件(Compare.txt)。

umdh -v Log1.txt Log2.txt > Compare.txt

生成的 Compare.txt 文件列出了每个日志中记录的调用堆栈,并为每个堆栈显示日志文件之间的堆分配更改。

例如,文件中的以下行显示了调用堆栈中标记为“Backtrace00053”的函数的分配大小更改。

在 Log1.txt 中,堆栈中的调用占 40,432 个 (0x9DF0) 字节,但在Log2.txt,相同的调用堆栈占 61,712 个 (0xF110) 字节,相差 21,280 (0x5320) 字节。

+ 5320 (f110 - 9df0) 3a allocs BackTrace00053 
Total increase == 5320

下面是分配的堆栈:

ntdll!RtlDebugAllocateHeap+0x000000FD
ntdll!RtlAllocateHeapSlowly+0x0000005A
ntdll!RtlAllocateHeap+0x00000808
MyApp!_heap_alloc_base+0x00000069
MyApp!_heap_alloc_dbg+0x000001A2
MyApp!_nh_malloc_dbg+0x00000023
MyApp!_nh_malloc+0x00000016
MyApp!operator new+0x0000000E
MyApp!LeakyFunc+0x0000001E
MyApp!main+0x0000002C
MyApp!mainCRTStartup+0x000000FC
KERNEL32!BaseProcessStart+0x0000003D

对调用堆栈的检查显示 LeakyFunc 函数正在使用 Visual C++ 运行时库分配内存。 如果检查其他日志文件后发现分配随时间推移而增长,则可能能够得出未释放从堆分配的内存的结论。

用于分析日志文件的符号文件

假设你有两台计算机:一 台用于 创建 UMDH 日志的日志记录计算机,一 台用于 分析 UMDH 日志的分析计算机。 分析计算机上的符号路径必须指向创建日志时在日志记录计算机上加载的 Windows 版本的符号。 不要将分析计算机上的符号路径指向符号服务器。 如果这样做,UMDH 将检索分析计算机上运行的 Windows 版本的符号,UMDH 不会显示有意义的结果。

另请参阅

使用 UMDH 查找用户模式内存泄漏