繁体   English   中英

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

[英]How to debug “Not enough storage is available to process this command”

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

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()

我的理解是这是某种内存不足的异常,具体分配给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暂停了该过程。 由于某种原因,现在异常有不同的消息: The operation completed successfully 但它仍然是来自同一段代码的相同的Win32Exception。

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM