C# 奇柄泄漏

C# 奇柄泄漏,c#,.net,mfc,interop,handle-leak,C#,.net,Mfc,Interop,Handle Leak,我的应用程序(基本应用程序是MFC与C++/CLI的互操作,但它也包含大量C#、Windows窗体、WPF)存在句柄泄漏。应用程序启动后不久,我可以看到任务管理器中的句柄数不断增长(以每秒10个新句柄的速度)。所以我过去常常看到它们是什么样的把手。我发现泄漏的句柄是进程句柄。它们是应用程序进程的进程句柄 所以我想知道什么操作通常会为它运行的进程创建句柄。有什么想法吗?你见过这样的事吗?考虑到我不能使用调试DLL,并且只能使用可以部署xcopy的工具,我还可以做些什么来追踪泄漏 更新: 我能投出w

我的应用程序(基本应用程序是MFC与C++/CLI的互操作,但它也包含大量C#、Windows窗体、WPF)存在句柄泄漏。应用程序启动后不久,我可以看到任务管理器中的句柄数不断增长(以每秒10个新句柄的速度)。所以我过去常常看到它们是什么样的把手。我发现泄漏的句柄是进程句柄。它们是应用程序进程的进程句柄

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

更新:

我能投出windbg和!手柄htrace对它进行了测试,发现进程句柄都是使用以下堆栈跟踪(按频率排序)创建的:


这告诉我什么

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

我通过针对我创建的互操作对象显式调用Marshal.ReleaseComObject解决了这个问题。在那一刻之后,对我来说没有问题


希望有帮助。

所以。。。您是否明确地使用了性能计数器(如果是这样,请尝试禁用它们以缩小泄漏源的范围)。

调用堆栈看起来是错误的。您是否正确设置了符号服务器。symfix应该在Windbg中实现这一点。之后,你应该得到一个更好的stacktrace

看起来有这个问题的部分代码是被管理的,所以在DuplicateHandle和OpenProcess上中断并在那里转储托管调用堆栈是有意义的。这两种方法是唯一能够生成真实进程句柄的方法

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

bp kernel32!OpenProcess "!ClrStack;g"

它还在增长吗?也就是说,它真的是一个漏洞还是只是运行时启动?它会继续增长到数百万个句柄,直到最终崩溃。托管代码调用堆栈呢?试着用英语!clrstack(可在SOS调试器扩展中获得)并查看它们是否为您提供了有关正在创建这些句柄的线索。编辑:我不知道您是否能够直接从句柄获取托管调用堆栈,但您仍然可以在内核32中设置断点!创建线程或内核32!CreateProcessEx函数并从there@bitbonk:您是否尝试过在
OpenProcess
设置断点?当应用程序最终崩溃时,事件日志中是否有异常处理程序或消息?这可能会给你更多的信息,在这个方法非常高之后。没有方法的长度超过几百字节。如果你看到的偏移量在数千或更多,这是一个肯定的迹象,你有错误或丢失的符号。调试器使用模块的最接近的导出方法作为回退,以显示至少一些内容。
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
bp kernel32!OpenProcess "!ClrStack;g"