如何调试“没有足够的存储空间来处理此命令”

我们已经开始体验Not enough storage available to process this command 。 该应用程序是WPF ,exception开始在正常工作几个小时后弹出。

 System.ComponentModel.Win32Exception (0x80004005): Not enough storage is available to process this command at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d) at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks) at System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters) at System.Windows.Window.CreateSourceWindow(Boolean duringShow) at System.Windows.Window.CreateSourceWindowDuringShow() at System.Windows.Window.SafeCreateWindowDuringShow() at System.Windows.Window.ShowHelper(Object booleanBox) at System.Windows.Window.Show() at System.Windows.Window.ShowDialog() 

我的理解是这是某种内存不足的exception,具体到windows resources分配。 可能的原因是什么,我该如何调试?


更新

我已经回顾了@Thili77( 这个 )提出的主题。 我使用GDIView和任务管理器来查看应用程序执行期间消耗的句柄(taskmgr中的句柄,USER对象和GDI对象),看起来它们看起来不像正在增长。 我的下一个测试是尝试在没有VS的情况下运行它一天(之前它在VS主机进程下运行)并检查是否仍然发生这种情况。 如果有人的话,我仍在寻找任何建议或提示

更新#2它发生在没有托管VS的新干净PC上。 在崩溃期间,句柄,USER对象和GDI对象都可以。 当PC处于崩溃状态时,没有任何工作正常 – 看起来手柄确实泄露,但ProcMon没有显示这些值的大数字。 奇怪的是,这总是发生在下午7点到8点左右,当时办公室里没有人,当我启动应用程序运行时无关紧要。 这已经是第三次崩溃了。 巧合? 只有我注意到我觉得奇怪的是应用程序的大量页面错误,它不断增长。 这有关系吗? 不再出现,请参阅更新#3

更新#3

接下来是我遇到的崩溃的细节。 系统是x86,app是x86,W7 SP1。 屏幕截图中显示的当前状态正好在崩溃之后,windbg暂停了该过程。 由于某种原因,现在exception有不同的消息: The operation completed successfully 。 但它仍然是来自同一段代码的Win32Exception。

我还需要确定我运行的桌面堆数量减少,并且启用了AppAnalyzer Basic选项 – 以便使故障更频繁(这似乎有效)。 时间假设确实是巧合,没有时间相关的共享主题再次注意到。 系统信息 流程 MyApp流程信息

一种可能性是全局primefaces表已用尽可用空间。 表中有0x4000个字符串primefaces的限制,并且分配给表的空间总量也有限制。 窗口类是此表中的一个内容。

我自己从未尝试过调试此类问题,但我确实找到了一篇关于使用WinDbg检查此问题的文章: 识别全局primefaces表泄漏 。 您可能希望将其视为可能的原因。

如果这是罪魁祸首,一个可能的原因是应用程序没有关闭Window实例。 HwndWrapper在其Dispose中清除其全局primefaces,这是响应于WM_DESTROY而发生的,响应于调用Window上的Close (或者设置DialogResult ,如果值改变则最终关闭窗口,并且通过调用ShowDialog显示窗口)而不是显示)。 primefaces泄漏也可能有其他可能的原因。

PS我之所以怀疑这是因为“没有足够的存储空间来处理此命令”是当RegisterClassEx无法添加到全局primefaces表时返回的错误。

看起来像Microsoft没有故意解决的问题,请查看此Connect链接 ,其中说明了:

我们感谢您的反馈。 但是,下一版本的WPF将不会解决此问题。 谢谢。 -WPF团队。

提供了一种解决方法,它可能有所帮助:

您可以通过向线程proc添加以下代码来解决此错误:

 Dispatcher dispatcher = Dispatcher.CurrentDispatcher; dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal); Dispatcher.Run(); 

这要求与线程关联的调度程序立即关闭。

根据我的经验,我收到了这种类型的exception,以防你的UI线程挂断,其他线程继续向主应用程序UI调度程序发送消息。 因此,在某段时间内,消息队列已满,并且您将收到此exception。

要调试,您可能需要在调试会话期间在VS中找到您的线程1(这是UI)并监视它的活动。 也许在某些外部事件或其他事件上有一些无限的服务员。