Win32Exception Memoria insufficiente per elaborare questo comando

Attraverso la mia raccolta automatica di crash per MaxTo ho ottenuto il seguente rapporto di arresto anomalo:

V8.12.0.0 - System.ComponentModel.Win32Exception - :Void UpdateLayered():0 Version: MaxTo8.12.0.0 Exception: System.ComponentModel.Win32Exception Error message: Not enough storage is available to process this command Stack trace: at System.Windows.Forms.Form.UpdateLayered() at System.Windows.Forms.Form.OnHandleCreated(EventArgs e) at System.Windows.Forms.Control.WmCreate(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.ContainerControl.WndProc(Message& m) at System.Windows.Forms.Form.WmCreate(Message& m) at System.Windows.Forms.Form.WndProc(Message& m) at MaxTo.MainForm.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

Un altro stacktrace:

 Version: MaxTo2009.9.0.0 Exception: System.ComponentModel.Win32Exception Error message: Not enough storage is available to process this command Stack trace: at System.Windows.Forms.Form.UpdateLayered() at System.Windows.Forms.Form.OnHandleCreated(EventArgs e) at System.Windows.Forms.Control.WmCreate(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at System.Windows.Forms.ContainerControl.WndProc(Message& m) at System.Windows.Forms.Form.WmCreate(Message& m) at System.Windows.Forms.Form.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

In questa ultima traccia dello stack non c’è alcun riferimento a MaxTo, e il 90% dei crash che ottengo sono con tracce dello stack simili a quelle sopra.

Leggendo in rete, trovo che questo errore è normale se ti dimentichi di rilasciare o disporre di variabili. Quando guardo attraverso il mio WndProc , che a volte sembra che il problema passi, non riesco a trovare un singolo posto che si blocca su riferimenti a qualsiasi object. Tutte tranne una delle variabili sono locali a WndProc e pertanto devono essere raccolte automaticamente quando il metodo termina.

 protected override void WndProc(ref Message m) { base.WndProc(ref m); // I'm assuming the first trace can be caught here IntPtr hwnd = m.WParam; // Our hook tells us something got maximized if (Win32Import.UWM_MAXIMIZE == (UInt32)m.Msg) { // Figure out if we are temporarily disabled or using alternative profiles KeyStateInfo keyState = KeyboardInfo.GetKeyState(Settings.AlternativeProfileKey); Rectangle r = FindRectangle(MousePosition, (Settings.EnableAlternativeProfile && keyState.IsPressed ? AlternativeRegions : Regions)); // Did we find a rectangle to place it in? if (r != Rectangle.Empty) { Rectangle position = Win32Import.GetWindowRectangle(hwnd); Rectangle previousPos = GetLocation(hwnd); if (position == r && previousPos != Rectangle.Empty) { // We are restoring the original position Win32Import.SetWindowPos(hwnd, IntPtr.Zero, previousPos.X, previousPos.Y, previousPos.Width, previousPos.Height, Win32Import.SWP_NOZORDER | Win32Import.SWP_NOSENDCHANGING); } else { // We are maximizing to a region Win32Import.ShowWindow(hwnd, Win32Import.WindowShowStyle.Restore); Win32Import.SetWindowPos(hwnd, IntPtr.Zero, rX, rY, r.Width, r.Height, Win32Import.SWP_NOZORDER | Win32Import.SWP_NOSENDCHANGING); // Make sure we remember this location RememberLocation(hwnd, position); } } } else if (MaxTo64WindowHandleMessage == m.Msg) { // Store the window handle of our 64-bit subprocess SubProcess64WindowHandle = m.WParam; } } 

Non sono stato in grado di riprodurre l’errore, anche durante l’esecuzione del programma per più giorni.

La mia ipotesi è che il sistema sia in esaurimento su memoria non frammentata o handle GDI, ma non posso confermarlo da nessuna parte. Non sembra esserci alcuna buona documentazione su questo errore.

Qualche idea cos’altro potrebbe essere? Posso fare qualcosa per prevenire questo errore?

Aggiornamento : la domanda è stata riaperta con più tracce di stack, a causa della mancanza di una soluzione decente. Semplicemente ignorarlo non risolve il problema.

Perdita o utilizzo di molti oggetti / handle GDI. Questi potrebbero causare una carenza di risorse. Potresti non essere in grado di riprodurre perché i tuoi utenti potrebbero avere altri programmi pesanti di risorse GDI in esecuzione o utilizzare Terminal Server, nel qual caso devono condividere parte dell’heap con gli altri utenti. Vedi Errore di sistema. Codice: 8. Spazio insufficiente per elaborare questo comando

Qui puoi leggere lo strumento Monitor Heap del desktop per diagnosticare problemi di heap del desktop.

Qui e qui e qui ci sono gli strumenti di rilevamento perdite GDI.

Il tuo programma sta probabilmente perdendo risorse del kernel. Iniziare a diagnosticare questo problema con Taskmgr.exe. Visualizza + Seleziona colonne, controlla Oggetti utente, Oggetti GDI e Gestisci conteggio. Esegui il tuo programma e osserva se qualcuno di questi aumenta costantemente. Una volta che uno di loro raggiunge 10.000 il tuo programma morirà.

Con un modo per vedere rapidamente la perdita in azione, è ansible avviare il codice di commento per vedere dove si verifica la perdita. Probabilmente ha qualcosa a che fare con il tuo “hook”.

Il problema probabilmente non risiede nel tuo WndProc – il motivo per cui lo vedi nei tuoi stack di chiamate è perché praticamente tutto ciò che riguarda la GUI su Windows passa attraverso la procedura della finestra WIN32. Sovrascriverlo nel tuo controllo ti dà semplicemente un punto di aghook per elaborare cose di basso livello prima che venga eseguita l’elaborazione di framework .NET di livello superiore.

Questo sarà un colpo completo nel buio, ma forse questo post potrebbe essere rilevante? – Probabilmente non con quelle tracce dello stack, comunque.

Avevo molti controlli personalizzati di Windows con risorse proprie, quindi quando creo molti controlli questo errore appare. Per risolvere questo problema ho creato un file di risorse nella mia libreria e utilizzato risorse esterne anziché risorse sul mio codice componente. Dopo che la mia eccezione è andata, già testato con 3 volte più moduli aperti e questo errore andato. Quindi sembra che sia una soluzione.