COM C#内存泄漏跟踪
有没有一种方法可以使用com dll找出c#应用程序中每个dll的内存使用情况?或者,您认为什么是找出为什么使用com对象时内存呈指数增长的最佳方法(即com对象是否存在内存泄漏,或者是否必须对传递给托管代码的对象进行某些特殊释放(和/或如何释放))。dotTrace rocks:COM C#内存泄漏跟踪,c#,com,memory-leaks,C#,Com,Memory Leaks,有没有一种方法可以使用com dll找出c#应用程序中每个dll的内存使用情况?或者,您认为什么是找出为什么使用com对象时内存呈指数增长的最佳方法(即com对象是否存在内存泄漏,或者是否必须对传递给托管代码的对象进行某些特殊释放(和/或如何释放))。dotTrace rocks: 请记住,.NET中的所有COM对象本质上都是MarshallByRefObject派生的类,因此您应该能够通过一个潜在的筛选器来查找此类对象的内存消耗。一位Microsoft支持工程师有一个精彩的博客,其中介绍了许多
请记住,.NET中的所有COM对象本质上都是MarshallByRefObject派生的类,因此您应该能够通过一个潜在的筛选器来查找此类对象的内存消耗。一位Microsoft支持工程师有一个精彩的博客,其中介绍了许多类似的情况。她检查了她使用的所有工具。几年前,当我调试这类东西时,我发现阅读她的所有帖子非常有帮助
编辑:显然,她增加了一系列的实验室,解释如何设置您的环境和诊断不同的问题。您可能想开始。我想做的第一件事是绝对确定我没有在任何地方泄漏引用,然后进入将复制这些步骤的最小步骤(一个好的探查器是必不可少的,我碰巧使用并推荐RedGate)——这是可以做到的,值得向COM对象的供应商发送示例代码来重现问题,以便他们能够解决问题(由于Crystal Reports内存泄漏,实际上有一个热修复程序,我发现:)您是否在使用后释放COM对象(
Marshal.ReleaseComObject
)
您传入/传出调用的参数类型是什么
如果您没有COM对象源代码,并且想要确定其“泄漏”的原因,请运行COM对象outa proc,将WinDBG附加到进程,并在内存分配API(HeapAlloc等)上设置断点。查看调用堆栈和分配模式。当然,您可以在托管端使用探查器,但如果您想知道发生了什么,您必须把手弄脏…希望探查器能为您提供所需信息,以便深入了解。