.NET应用程序处理泄漏,如何定位源?

时间:2016-12-21 07:56:31

标签: windows performance memory-leaks windbg

我有一个在生产环境中运行的.NET应用程序(WINDOWS XP + .NET 3.5 SP1),其稳定句柄数约为2000,但在某些未知情况下,其句柄数量将极快增加并最终崩溃(超过10,000)由PerfMon工具监控。)

我在增加期间从那里做了一次内存转储(还没有崩溃)并导入到WinDbg,可以看到整体句柄摘要:

0:000> !handle 0 0
7229 Handles
Type            Count
None            19
Event           504
Section         6108
File            262
Port            15
Directory       3
Mutant          56
WindowStation   2
Semaphore       70
Key             97
Token           2
Process         3
Thread          75
Desktop         1
IoCompletion    9
Timer           2
KeyedEvent      1


  

所以毫不奇怪,泄漏类型是Section,挖掘更多:

0:000> !handle 0 ff Section
Handle 00007114
  Type          Section
  Attributes    0
  GrantedAccess 0xf0007:
         Delete,ReadControl,WriteDac,WriteOwner
         Query,MapWrite,MapRead
  HandleCount   2
  PointerCount  4
  Name          \BaseNamedObjects\MSCTF.MarshalInterface.FileMap.IBC.AKCHAC.CGOOBGKD
  No object specific information available
Handle 00007134
  Type          Section
  Attributes    0
  GrantedAccess 0xf0007:
         Delete,ReadControl,WriteDac,WriteOwner
         Query,MapWrite,MapRead
  HandleCount   2
  PointerCount  4
  Name          \BaseNamedObjects\MSCTF.MarshalInterface.FileMap.IBC.GKCHAC.KCLBDGKD
  No object specific information available

...
...
...
...
6108 handles of type Section

可以看到BaseNamedObjects'命名约定都是MSCTF.MarshalInterface.FileMap.IBC.***.*****

基本上我被阻止了,并且无法继续将信息链接到我的应用程序。

任何人都可以提供帮助吗?

[Edit0]

尝试了GFlags命令(+ust或通过UI)的几种组合,没有运气,使用WinDbg打开的转储总是看不到!htrace,所以必须使用附加过程最后我得到了上面泄漏句柄的堆栈:

0:033> !htrace 1758
--------------------------------------
Handle = 0x00001758 - OPEN
Thread ID = 0x00000768, Process ID = 0x00001784

0x7c809543: KERNEL32!CreateFileMappingA+0x0000006e
0x74723917: MSCTF!CCicFileMappingStatic::Create+0x00000022
0x7473fc0f: MSCTF!CicCoMarshalInterface+0x000000f8
0x747408e9: MSCTF!CStub::stub_OutParam+0x00000110
0x74742b05: MSCTF!CStubIUnknown::stub_QueryInterface+0x0000009e
0x74743e75: MSCTF!CStubITfLangBarItem::Invoke+0x00000014
0x7473fdb9: MSCTF!HandleSendReceiveMsg+0x00000171
0x7474037f: MSCTF!CicMarshalWndProc+0x00000161
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Windows\system32\USER32.dll - 
0x7e418734: USER32!GetDC+0x0000006d
0x7e418816: USER32!GetDC+0x0000014f
0x7e4189cd: USER32!GetWindowLongW+0x00000127
--------------------------------------

然后我再次陷入困境,堆栈似乎不包含任何用户代码,前进的建议是什么?

1 个答案:

答案 0 :(得分:1)

WinDbg不是内存泄漏的理想工具,尤其是事先没有做好准备。

有一个GFlags选项(+ust)可以启用进程来记录句柄分配的堆栈跟踪。如果您没有启用此标志,则可能无法从转储中获取更多信息。如果您拥有它,请使用!htrace查看堆栈。

您还可以尝试UMDH (user mode dump heap),这是一款免费工具。或者获得类似memory validator的东西,它具有更好的可用性,因此从长远来看它可能会得到回报。