Windows堆分配调用堆栈 – 奇怪的调用堆栈

我试图分析一个托pipe进程内存转储嫌疑人,如果本机内存泄漏。 为了能够使用windbg(并从那里使用!堆扩展),我激活了用户模式调用堆栈的服务器进程

我看到很多大小为68的块。在那些块(我可以手动validation使用!堆-p -a )中,有很多forms的调用堆栈

!heap -p -a 000000003ca5cfd0 address 000000003ca5cfd0 found in _HEAP @ 1ea0000 HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 000000003ca5cfa0 0009 0000 [00] 000000003ca5cfd0 00068 - (busy) 7766bbed ntdll! ?? ::FNODOBFM::`string'+0x000000000001913b 7fef7b76a57 msvcr120!malloc+0x000000000000005b 7fef7b76967 msvcr120!operator new+0x000000000000001f 7fe9a5cdaf8 +0x000007fe9a5cdaf8 

你有什么想法是什么这些分配,因为他们需要我的转储文件数百MB?

编辑 lm显示以下周围的区域7fe9a5cdaf8 (截断)

 start end module name 00000000`773b0000 00000000`774cf000 kernel32 (pdb symbols) 00000000`774d0000 00000000`775ca000 user32 (deferred) 00000000`775d0000 00000000`77779000 ntdll (pdb symbols) 00000000`77790000 00000000`77797000 psapi (deferred) 00000000`777a0000 00000000`777a3000 normaliz (deferred) 00000001`3f810000 00000001`3f818000 ManagedService (deferred) 000007fe`dd2d0000 000007fe`de398000 System_Web_ni (deferred) 

我认为没有为您的应用程序创建本地图像(使用NGen)。 在这种情况下,模块(DLL)只包含永远不会执行的IL代码。 所以,从本机的角度来看,模块内部不会有任何堆栈。

IL代码将被JIT编译到内存中的另一个位置,例如7fe9a5cdaf8。 这就是真正的代码执行的地方,所以这就是你从本地方面看到的。

要将JIT编译指令恢复为其.NET方法描述符,请执行以下操作:

 0:000> .symfix 0:000> .loadby sos mscorwks ; *** .NET 2 0:000> .loadby sos clr ; *** .NET 4 0:000> !ip2md 7fe9a5cdaf8 

输出应该显示.NET方法名称(这里的例子,因为我没有你的转储):

 MethodDesc: 000007ff00033450 Method Name: ManagedService.Program.Main() Class: 000007ff00162438 MethodTable: 000007ff00033460 mdToken: 0600001f modulee: 000007ff00032e30 IsJitted: yes CodeAddr: 000007ff00170120