当前位置: 首页 > 编程语言 > C#

如何诊断句柄泄漏?分享

时间:2023-04-11 10:37:17 C#

手柄漏水如何诊断?我有一个托管WCFServiceHost的进程。根据ProcessExplorer的说法,它会疯狂地泄漏句柄。我查看了代码,找不到任何明显导致句柄泄漏的东西。我最接近的是ProcessExplorer提供的句柄列表,但它的用处似乎有限。是否有任何其他工具可以帮助诊断句柄的来源,例如通过堆栈跟踪或其他工具?编辑我已经安装了Windbg。当我使用它来列出句柄时,它显示914个句柄属于“事件”类型-如果我选择其中一些,并使用!handlexf输出,在大多数情况下我得到类似于此的输出:TypeEventAttributes0GrantedAccess0x1f0003HandleCount2PointerCount3对象特定信息事件类型手动重置事件已设置有没有办法进一步深入了解有关事件的更多信息?很抱歉之前的错误答案(现已删除,显示)。Windows调试工具包括WinDbg和它的朋友。WindDbg是一个像VisualStudio一样的完整调试器,但更精简,并且在许多方面更强大。运行WinDbg,附加到您的进程(F6),然后在命令窗口中键入!handle。您将获得所有句柄的列表和一些统计信息。如果您向上滚动并看到一个看起来可能是错误的!handlef,您可以执行此操作!handlef以显示有关它的更多信息。例如,附加到我系统上的iexplore.exe:0:019>!handle1bcfHandle1bcTypeKeyAttributes0GrantedAccess0x2001f:ReadControlQueryValue,SetValue,CreateSubKey,EnumSubKey,NotifyHandleCount2PointerCount3NameREGISTRYUSERS-1-5-21-498032705-2416727736-2837886327-1001SoftwareMicrosoftWindowsCurrentVersionInternet设置对象特定信息密钥最后写入时间:11:04:51。9/4/2011KeynameInternetSettingsEdit要查找更多信息,您可以使用!htracewindbg命令。要使用它,请使用windbg附加到您的进程,然后键入!htrace-enable,然后键入g以恢复该进程。稍微练习一下这个过程,然后使用CTRL-Break(即CTRL-Pause)CTRL-Break。输入!htrace-diff。您应该会看到一个堆栈跟踪列表,其中显示句柄已打开以及打开时的调用堆栈。如果您没有设置Windows符号,唯一有意义的地址将是您自己的代码——但这应该足以为您提供所需的线索。modload:000000,75020000000000000000000000000000D000wintrust.dllmodload:00000000,75160000000000000000000000,7527D000crypt32.dllmodload:000000000000000000000000000000000000000000,757DC000;!DbgBreakPoint:00000000`77440530ccint30:019>!htrace-enable启用句柄跟踪。成功拍摄处理跟踪信息快照。0:019>g(2fd0.2c88):Break指令异常-代码80000003(第一次机会)ntdll!DbgBreakPoint:00000000`77440530ccint30:019>!htrace-diff处理跟踪信息快照已成功获取。0x360自上次快照以来的新堆栈跟踪。忽略已经关闭的句柄...自上次快照以来打开的未完成句柄:-------------------------------------句柄=0x000000000000070c-打开线程ID=0x0000000000000c44,进程ID=0x0000000000002fd00x000000007744232a:ntdll!NtOpenThread+0x000000000000000a00000074c83910:wow64!whNtOpenThread+0x00000000000000a00x0000000074c6cf87:wow64!Wow64SystemServiceEx+0x00000000000000d70x0000000074bf2776:wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d0x0000000074c6d07e:wow64!RunCpuSimulation+0x000000000000000a0x0000000074c6c549:wow64!Wow64LdrpInitialize+0x00000000000004290x000000007746e707:ntdll!??::FNODOBFM::`string'+0x00000000000293640x000000007741c32e:ntdll!LdrInitializeThunk+0x000000000000000e0x00000000775f113a:ntdll_775d0000!ZwOpenThread+0x00000000000000120x0000000075ea2e32:KERNELBASE!OpenThread+0x00000000000000490x00000000755578df:iertutil!CIsoMalloc::AllocArtifact+0x00000000000000500x00000000755578b4:iertutil!CIntraprocessMessageQueueSite::_QueryMessageThreadAffinityHelper_UntrustedSerializedIsoMessage+0x00000000000000550x0000000075557754:iertutil!CIntraprocessMessageQueueSite::QueryMessageThreadAffinity+0x000000000000004b--------------------------------------句柄=0x0000000000000790-OPENThreadID=0x00000000000019d4,ProcessID=0x0000000000002fd00x000000007744226a:ntdll!NtOpenKeyEx+0x000000000000000a0x0000000074c8d205:wow64!Wow64NtOpenKey+0x00000000000000910x0000000074c8314f:wow64!whNtOpenKeyEx+0x00000000000000730x0000000074c6cf87:wow64!Wow64SystemServiceEx+0x00000000000000d70x0000000074bf2776:wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d0x0000000074c6d07e:wow64!RunCpuSimulation+0x000000000000000a0x0000000074c6c549:wow64!Wow64LdrpInitialize+0x00000000000004290x000000007746e707:ntdll!??::FNODOBFM::`string'+0x00000000000293640x000000007741c32e:ntdll!LdrInitializeThunk+0x000000000000000e0x00000000775f101a:ntdll_775d0000!ZwOpenKeyEx+0x00000000000000120x0000000075ad2271:KERNEL32!LocalBaseRegOpenKey+0x000000000000010c0x0000000075ad2416:KERNEL32!RegOpenKeyExInternalW+0x00000000000001300x0000000075ad2302:KERNEL32!RegOpenKeyExW+0x0000000000000021--------------------------------------Handle=0x0000000000000788-OPENThreadID=0x00000000000019d4,ProcessID=0x0000000000002fd00x000000007744226a:ntdll!NtOpenKeyEx+0x000000000000000a0x0000000074c8d205:wow64!Wow64NtOpenKey+0x00000000000000910x0000000074c8314f:wow64!whNtOpenKeyEx+0x00000000000000730x0000000074c6cf87:wow64!Wow64SystemServiceEx+0x00000000000000d70x0000000074bf2776:WOW64CPU!turboDisPatchJumpAddressEnd+0x00000000000000002D0x00000000000074C6D07E:WOW64!runcpusimulation+0x000000000000000000000000000000000000000000000000000000000000000000000000000000000074C6C549:WOW64!WOW64!64LLDRPINITIALIME+0000000000000000000000000000000000000000000000000000000000000000000000000零州??::FNODOBFM::`string'+0x00000000000293640x000000007741c32e:ntdll!LdrInitializeThunk+0x000000000000000e0x00000000775f101a:ntdll_775d0000!ZwOpenKeyEx+0x00000000000000120x0000000075ad2271:KERNEL32!LocalBaseRegOpenKey+0x000000000000010c0x0000000075ad2416:KERNEL32!RegOpenKeyExInternalW+0x00000000000001300x0000000075ad2302:KERNEL32!RegOpenKeyExW+0x0000000000000021使用内存分析Controllers——它们可以帮助发现此类泄漏,例如:以上是C#学习教程:Howtodiagnosehandleleaks?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: