Grâce à ma collection crash automatisé pour MaxTo je suis arrivé le rapport d'accident suivant:Win32Exception Pas assez de stockage est disponible pour traiter cette commande
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)
Une autre 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)
Dans cette dernière trace de la pile, il n'est pas du tout une référence à MaxTo, et 90% des plantages que je reçois sont avec des traces de pile similaires à celles ci-dessus. Lecture sur le net Je trouve que cette erreur est habituelle si vous oubliez de libérer ou de disposer des variables. Lorsque je regarde à travers mon WndProc
, qui semble parfois avoir le problème passer, je ne peux pas trouver un seul endroit qui se accroche à des références à des objets. Toutes les variables, sauf une, sont locales à WndProc et doivent donc être collectées lorsque la méthode se termine.
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, r.X, r.Y, 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;
}
}
Je n'ai pas réussi à reproduire l'erreur, même si vous avez exécuté le programme sur plusieurs jours. Mon hypothèse est que le système est faible sur la mémoire non fragmentée ou les poignées GDI, mais je ne peux pas le confirmer où que ce soit. Il ne semble pas y avoir de bonne documentation sur cette erreur.
Des idées quoi d'autre pourrait-il être? Puis-je faire quelque chose pour éviter cette erreur?
Mise à jour: La question a été rouverte avec plus de traces de pile, en raison de l'absence d'une solution décente. Le fait de l'ignorer ne résout pas le problème.
Non lié à la question mais comment collectez-vous les rapports d'accident? – Giorgi
Utilisation de Fogbugz BugzScout (Google it) et d'un gestionnaire d'erreurs global personnalisé dans le programme. Ce n'est pas trop dur. –
Est-ce que quelque chose est signalé dans le journal des événements de l'application Windows au moment de l'erreur? –