【发布时间】:2010-10-07 15:09:20
【问题描述】:
通过我对MaxTo 的自动崩溃收集,我得到了以下崩溃报告:
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)
另一个堆栈跟踪:
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)
在这个最新的堆栈跟踪中,根本没有提到 MaxTo,而且我遇到的 90% 的崩溃都与上述类似的堆栈跟踪有关。
在网上阅读我发现如果您忘记释放或处置变量,此错误很常见。在查看我的WndProc(有时似乎会出现问题)时,我找不到一个可以引用任何对象的地方。除了一个变量之外的所有变量都是 WndProc 的本地变量,因此应该在方法终止时进行垃圾回收。
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;
}
}
我无法重现该错误,即使运行该程序数天。
我的假设是系统的未碎片化内存或 GDI 句柄不足,但我无法在任何地方确认这一点。似乎没有关于此错误的任何好的文档。
还有什么想法吗?我可以做些什么来防止这个错误吗?
更新:由于缺乏一个体面的解决方案,这个问题被重新打开了更多的堆栈跟踪。简单地忽略它并不能解决问题。
【问题讨论】:
-
与问题无关,但如何收集崩溃报告?
-
在程序中使用 Fogbugz BugzScout(谷歌搜索)和自定义编写的全局错误处理程序。难度不大。
-
出现错误时 Windows 应用程序事件日志中是否报告了任何内容?
-
我不知道。我只知道这个错误是上面的堆栈跟踪。
-
你想显示一个不透明的窗口吗?我的意思是,透明的?您的用户是否有旧显卡(不支持透明胶片和玻璃效果之类的东西?)。
标签: c# .net winapi win32exception