繁体   English   中英

奇手柄泄漏

[英]odd handle leak

我的应用程序(基本应用程序是MFC与C ++ / CLI互操作,但它也包含很多C#,Windows窗体,WPF)有一个句柄泄漏。 在应用程序启动后不久,我可以看到任务管理器中的句柄计数不断增长(以每秒10个新句柄的速率)。 所以我使用handles.exe来查看它们是什么类型的句柄。 我发现泄漏的手柄是工艺手柄。 它们是我的应用程序流程的流程句柄。

所以我想知道什么操作通常会创建它运行的进程的句柄。任何想法? 你见过这样的东西吗? 考虑到我不能使用调试DLL并且我只能使用可以部署xcopy的工具,我还能做些什么来追踪泄漏。

更新:

我能够向它发出 windbg!handle,!htrace ,并发现进程句柄都是使用以下堆栈跟踪创建的(按频率排序):

0x79f7570b: mscorwks!CorExitProcess+0x00022055
0x79f03edd: mscorwks!GetPrivateContextsPerfCounters+0x0000b6fe
0x79f04b87: mscorwks!GetPrivateContextsPerfCounters+0x0000c3a8
0x79f04b03: mscorwks!GetPrivateContextsPerfCounters+0x0000c324
0x79f919bf: mscorwks!CorExitProcess+0x0003e309
0x79f91b28: mscorwks!CorExitProcess+0x0003e472
0x792d6b4c: mscorlib_ni+0x00216b4c
0x1391a663: +0x1391a663
0x1391a0b1: +0x1391a0b1
0x7a9ea544: System_ni+0x005aa544
0x792a842f: mscorlib_ni+0x001e842f

要么

0x7c8106f5: kernel32!CreateThread+0x0000001e
0x79f04bb2: mscorwks!GetPrivateContextsPerfCounters+0x0000c3d3
0x79f04b03: mscorwks!GetPrivateContextsPerfCounters+0x0000c324
0x79f919bf: mscorwks!CorExitProcess+0x0003e309
0x79f91b28: mscorwks!CorExitProcess+0x0003e472
0x792d6b4c: mscorlib_ni+0x00216b4c
0x1391a663: +0x1391a663
0x1391a0b1: +0x1391a0b1
0x7a9ea544: System_ni+0x005aa544
0x792a842f: mscorlib_ni+0x001e842f

要么

0x08ec2eba: +0x08ec2eba
0x792b8277: mscorlib_ni+0x001f8277
0x792b8190: mscorlib_ni+0x001f8190
0x792b8040: mscorlib_ni+0x001f8040
0x792b7ff2: mscorlib_ni+0x001f7ff2
0x677e48f3: System_Runtime_Remoting_ni+0x000748f3
0x677e44be: System_Runtime_Remoting_ni+0x000744be
0x677e46ec: System_Runtime_Remoting_ni+0x000746ec
0x677e8408: System_Runtime_Remoting_ni+0x00078408
0x7926eb8d: mscorlib_ni+0x001aeb8d

那告诉我什么?

调用堆栈看起来不对。 您是否正确设置了符号服务器? .symfix应该在Windbg中做到这一点。 之后你应该得到一个更好的堆栈跟踪。

它似乎是管理此问题的代码的一部分,因此在DuplicateHandle和OpenProcess上打破并在那里转储托管调用堆栈是有意义的。 这两种方法是唯一可以产生真正过程句柄的方法。

您可以声明这样的断点,并在命中断点时执行命令。 在这种情况下,将打印托管堆栈,然后继续执行。

bp kernel32!OpenProcess "!ClrStack;g"

与通过互操作调用COM对象的Web服务有相同的问题。

我通过明确地对我创建的互操作对象调用Marshal.ReleaseComObject来解决这个问题。 那之后对我来说没有问题。

希望能帮助到你。

那么......你是否明确地做了性能计数器(如果是这样,试着禁止它们缩小泄漏源)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM