【发布时间】:2017-03-29 04:35:53
【问题描述】:
有一个包含数十万 C# 行的大型商业 WPF 应用程序。我最近被分配到它。该应用程序还使用(最新版本的)第三方组件(知名的第 3 方组件提供商,我不想列出它们)。
内存泄漏仅发生在某些合作伙伴身上。他们在早上启动应用程序并使用它几个小时,然后它会完全消耗内存并最终变得如此缓慢,以至于他们必须重新启动它(每天几次)。他们有 Windows 10 机器(但这可能没有意义)。无法重现我这边的泄漏。
合作伙伴允许我发布该应用的特殊版本,但不允许使用内存分析器(他们想将该应用用于生产,而附加的分析器会减慢它的速度)。所以我的想法是:让我们发布一个记录所有内容的特殊版本,包括用户点击和“可疑”GC 根的处理。正如我所说,我不知道我必须调试的代码,所以我用内存分析器确定了潜在的泄漏 GC 根。 (是的,我列出了可能的罪魁祸首,例如依赖属性、静态列表等,但到目前为止还没有运气。正如我所说,我不太了解源代码,但我可以访问它并且可以修改它的任何部分。)
我实际上是在写一个编程问题:除了用户行为和对静态变量的访问之外,我还应该记录什么?也许我应该在每个用户操作之后记录可用内存。什么是合适的 .NET 方法?
合作伙伴会在重启应用之前复制并发送日志文件。
【问题讨论】:
-
我正在使用"Self-profiling" API of dotTrace 发送我的应用程序。用户可以设置一个复选框来启用/禁用分析。似乎只有 performance 分析,而不是 memory 分析。
-
我认为最好的办法不是记录所有内容,而是在应用程序运行缓慢时收集内存转储。然后让客户端将该内存转储传递给您并进行分析。
-
@Evk:有 API 方法吗?合作伙伴在 IT 方面并不真正胜任,他们希望在“分析”或日志记录过程中使用该应用程序进行正常工作。所以他们可以找到日志 txt 文件,但不能创建转储。他们也不想叫我来创建内存转储。 (其他问题:应用程序的某些部分写得不太好,所以在我自己的测试中,内存有时会增长很多,但几分钟后,发生了一次大 GC,一切又好了。不在他们的机器上......)
-
您可以使用 Windows 任务管理器获取转储(右键单击进程,选择转储)。当应用程序变慢到要重新启动它的程度时,您的合作伙伴可以这样做。如果这对他们来说太复杂了,您可以在您的应用程序中添加一个按钮,他们可以单击该按钮来执行此操作。
-
@Evk:谢谢。这会是 .NET 特定/托管内存分析器也能理解的转储吗?还是只是一个完全原生的转储?
标签: c# wpf memory-management memory-leaks windows-10