假设有一个 C# 程序,它用作 Windows 服务。假设该服务已经变得疯狂并且正在疯狂地消耗 CPU 和内存。它需要很快重新启动,因为它是一个生产系统。所以我没有太多时间来收集运行时信息。也许快速浏览一下任务管理器......就这样。

之后,我所拥有的只是 log4net 日志文件和用于事后分析的 Windows 事件日志。

假设我已经找到了问题的原因。其他人修复了它,也许程序员添加了一些额外的日志记录,这样我下次就可以更快地找到类似的问题。尽管如此:我仍然依赖日志文件的质量,并希望下次问题能够以某种方式在日志记录中显现出来。

还有其他方法进行事后分析吗?也许像线程转储(如在java中)、内存转储或其他东西,这可能有助于事后分析?也许一些内置的 .NET 框架工具可以提供帮助?

我对真实的项目经验以及如何尝试解决这个维护问题非常感兴趣,我认为这对于大多数程序员来说都是非常现实的。

有帮助吗?

解决方案

作为Marc说WinDbg+SoS会让你试一个很大的问题,你不能真正解决在Visual Studio.有一些优秀的教程 这个博客的.

对于存问题也可以看看。净业绩计数器在性能监视器.你可以看看那里的对象的位置(其代)和多少时间是花在收集垃圾。这应该给你一些有用的信息。如果你想知道为什么对象是不被收集WinDbg和SoS的路要走。你通过一个简单的届会的步骤是:

  1. 检查堆使用 !dumpheap -stat, ,寻找大量的实例。你可能有一些想法是什么你希望找到在堆在任何时候,所以如果有什么看起来与众不同,看到这一点。

  2. 随机挑选的实例和做 !gcroot 在该地址的实例。这会告诉你为什么对象是不被收集。

  3. 重复

可能的候选人为保持的东西活着长比它应该是:事件,静和终结的队列举几例。

你可能还想要看看我的答案 这个问题 看到更多的WinDbg的东西。

其他提示

您可以做的崩溃与.NET转储,并期待在他们的WinDbg / SOS(和sosassist)。并不简单,但它的工作原理。但相当铁杆。上的 “+ + WinDBG的.NET” 的搜索应该证明有趣。

除此之外 - 资源计数器?日志文件?事情你可能看的是地段还算可以很容易地启用。

不幸的是我不得不做的这个相当数量的 - 最好的工具,我所遇到的是其Cordbg中自带的SDK(你需要为你的.NET版本的正确版本)。 http://msdn.microsoft.com/en-us/library/a6zb7c8d。 ASPX 获得的信息。

附加到正在运行的过程中Cordbg中(一<[PID]>),附加到每个正在运行的线程(T <[TID]>),然后转储栈为每个线程(W)。

自动化这个任务一点点VB脚本,然后倾倒到一个文件将允许您运行此工具多次,捕获它的输出到文件中。比较所有线程堆栈会给你一个很好的主意,因为你的程序是花钱的时候。

这个方法的好处,尤其是自动垃圾场,是你可以非常快速地获取所有信息,并让你的过程的最短时间重新启动。

Tess Ferrandez 是使用 WinDbg 和 SOS 进行事后分析的重要资源 系列博客文章 就此主题而言。

编辑:链接已更新

如果该进程仍然活着,那么你可以运行托管堆栈浏览器反对获得的它是做什么的快照。您可以在不明确的安装运行此。

除此之外,然后完全转储+ WinDbg的+ SOS为您提供了最多的信息,但得到它是不平凡的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top