C#OutOfMemoryException - 如何追查罪魁祸首

时间:2011-02-17 14:00:34

标签: c# wpf debugging out-of-memory

我有一个C#/ WPF应用程序,可以在具有512 MB内存的小型平板电脑上运行。如果要继续运行,最终会抛出OutOfMemoryException。这可能需要12个小时到2天才能完成。

使用ProcessExplorer和.NET Memory Profiler,我看不到我的应用程序使用的内存随着时间的推移而增长的证据。只有一个典型的小增长模式,然后是垃圾收集。

我添加了代码,用于在抛出异常时打印出所有正在运行的进程及其内存信息。我现在正在等待它再次发生。我应该提到PC是基于闪存的,并且禁用了分页。 512是一个硬限制。

它发生在两台独立的PC上。两种情况下的异常信息都相同:

Top Level Exception - System.OutOfMemoryException: Insufficient memory to continue the execution of the program.
    at System.Windows.Media.Composition.DUCE+Channel.SendCommand(Byte* pCommandData, Int32 cSize)
    at System.Windows.Media.MediaContext.EnterInterlockedPresentation()
    at System.Windows.Media.MediaContext.ScheduleNextRenderOp(TimeSpan minimumDelay)
    at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
    at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget)
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

非常感谢任何见解!

3 个答案:

答案 0 :(得分:1)

由于您是“小型平板电脑”,也许您正在调用一些非“.Net”代码来控制某些硬件。是这样,也许该程序的一部分可能正在使用一个公平的内存(但仍然没有泄漏)。要在这种情况下让垃圾收集器更加努力,请查看添加GC.AddMemoryPressure()调用。

答案 1 :(得分:1)

事实证明,各种问题导致我的应用程序崩溃。我已经在另一个post here详细介绍了它们。

答案 2 :(得分:0)

我遇到了一篇非常好的文章,深入探讨了错误。

WPF Render Thread Errors

最有说服力的paragaph:不要试图分析你给出的调用堆栈:

  

由于设计,不幸的是,您看到的异常和callstack   在UI线程上通常不能帮助诊断真正的原因   这个问题。这是因为在抛出异常时   它已经在渲染线程上的失败点之后。这样   时间,关键状态已经丢失在渲染线程上   帮助我们了解故障发生的位置和原因。