WPF中的win32窗口

时间:2009-12-22 06:50:41

标签: .net wpf windbg out-of-memory

最近我们的应用程序遇到了一个奇怪的问题。

该应用程序在WPF窗口中有一个win32窗口, 调整WPF窗口大小时,问题就出现了。

堆栈跟踪:

Exception object: 0000000002ab2c78
Exception type: System.OutOfMemoryException
InnerException: <none>
StackTrace (generated):
    SP       IP       Function
    0048D94C 689FB82F PresentationCore_ni!System.Windows.Media.Composition.DUCE+Channel.SyncFlush()+0x80323f
    0048D98C 681FEE37 PresentationCore_ni!System.Windows.Media.Composition.DUCE+CompositionTarget.UpdateWindowSettings(ResourceHandle, RECT, System.Windows.Media.Color, Single, System.Windows.Media.Composition.MILWindowLayerType, System.Windows.Media.Composition.MILTransparencyFlags, Boolean, Boolean, Boolean, Int32, Channel)+0x127
    0048DA38 681FEAD1 PresentationCore_ni!System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean, System.Nullable`1<ChannelSet>)+0x301
    0048DBC8 6820718F PresentationCore_ni!System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean)+0x2f
    0048DBDC 68207085 PresentationCore_ni!System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr)+0x185
    0048DC34 681FFE9F PresentationCore_ni!System.Windows.Interop.HwndTarget.HandleMessage(Int32, IntPtr, IntPtr)+0xff
    0048DC64 681FD0BA PresentationCore_ni!System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)+0x3a
    0048DC88 68C6668E WindowsBase_ni!MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)+0xbe
    0048DCD4 68C665BA WindowsBase_ni!MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)+0x7a
    0048DCE4 68C664AA WindowsBase_ni!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Boolean)+0x8a
    0048DD08 68C6639A WindowsBase_ni!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Boolean, System.Delegate)+0x4a
    0048DD50 68C64504 WindowsBase_ni!System.Windows.Threading.Dispatcher.WrappedInvoke(System.Delegate, System.Object, Boolean, System.Delegate)+0x44
    0048DD70 68C63661 WindowsBase_ni!System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Boolean)+0x91
    0048DDB4 68C635B0 WindowsBase_ni!System.Windows.Threading.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority, System.Delegate, System.Object)+0x40
    0048DDD8 68C65CFC WindowsBase_ni!MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)+0xdc

StackTraceString: <none>
HResult: 8007000e

另外,我找到了一些相关的链接:

relatedA

relatedB

  1. 有没有办法避免或处理这个问题?

  2. 如何找出真正的问题?

  3. 从调用堆栈中,我们可以确定问题来自.NET Framework吗?

  4. 感谢您的回答或评论!

4 个答案:

答案 0 :(得分:23)

答案 1 :(得分:2)

这是WPF内存泄漏的有用article。您也可以考虑使用RedGate中的ANTS Performance和/或Memory Profiler来帮助诊断这样的问题。

HTH

答案 2 :(得分:1)

我不确定堆栈部分(或者至少是UXTheme的东西)是值得信赖的。堆栈的底部似乎正常。我们看到似乎是一个试图进行清理的异常处理程序。然后大量嵌套调用各种堆管理代码层。

但是这个堆栈从RtlFreeHeap转换到ConvertToUnicode的部分没有任何意义。我怀疑上面的所有内容都是以前使用堆栈时剩下的。

0048f40c 6b88f208 mscorwks!_EH_epilog3_GS+0xa, calling mscorwks!__security_check_cookie 
0048f410 6b8a756e mscorwks!SString::ConvertToUnicode+0x81, calling mscorwks!_EH_epilog3_GS 
0048f424 77b4371e ntdll_77b10000!RtlpFreeHeap+0xbb1, calling ntdll_77b10000!RtlLeaveCriticalSection 
0048f42c 77b436fa ntdll_77b10000!RtlpFreeHeap+0xb7a, calling ntdll_77b10000!_SEH_epilog4 

RtlFreeHeap中的崩溃指向堆损坏,建议问题出在非托管代码中,但是manged对象的内存最终必须从非托管内存中分配,因此它可能是。

我建议您查找非托管窗口可能损坏堆的地方;多个免费的相同分配,或覆盖分配的边界。

答案 3 :(得分:0)

如果它有助于遇到SyncFlush问题的人,我们刚刚解决了我们的问题,这得益于Microsoft的出色支持(通过我的MSDN订阅)。事实证明,我们使用timeBeginPeriod和timeEndPeriod调用创建了更多的多媒体计时器。这些计时器是一种有限的资源,一旦它们用完了,WPF渲染线程就会缺少计时器并退出工作。