簡體   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