我有每个会话服务模式的 WCF 服务,并使用 WIF 进行身份验证/授权。但是一些客户正在使渠道泄漏。
有没有办法使用内存转储和 windbg 查看哪个客户端正在泄漏?我不能使用客户端 IP 地址,因为不止一个客户端来自同一个 IP。用户身份可能很有用,但我找不到泄漏的服务实例和使用的 ClaimIdentity 之间的联系。
下面的WinDbg可以帮助你找到泄露的渠道:
!dumpheap -type <Some WCF Type or yours that you suspect to be leaking>
这将显示特定类型的所有实例的列表。一旦你确定了泄漏的对象
!do <object address>
这将让您检查对象及其属性。这样您就可以获取用于此频道的 ClaimId
!gcroot
这将使您知道是什么对象将泄漏对象保留在内存中并帮助您修复它。这听起来比实际识别客户端更有用,因为它似乎更有可能是您的服务器代码的问题。
其他有用的命令
!gcwhere <Address>
!FindRoots -gen 1
!FindRoots <Address>
!GCHandleLeaks
!eeheap
!dumpheap -stat
!TraverseHeap fileName
!ObjSize
!FindRoots
也就是说,我要推荐 RedGate 的内存分析器。在过去的几年里,识别内存泄漏已经取得了长足的进步。您可以获得14 天的试用期。