Mik*_*ail 5 opengl debugging mfc exception-handling visual-studio-2005
我有一个使用MSVS2005创建的基于MFC驱动的基于对话框的应用程序.这是我一步一步的问题.我的对话框上有按钮和相应的点击处理程序,代码如下:
int* i = 0;
*i = 3;
Run Code Online (Sandbox Code Playgroud)
我正在运行程序的调试版本,当我点击按钮时,Visual Studio捕获焦点并警告"访问违规写入位置"异常,程序无法从错误中恢复,我所能做的就是停止调试.这是正确的行为.
现在我在OnInitDialog()方法中添加一些OpenGL初始化代码:
HDC DC = GetDC(GetSafeHwnd());
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGL
PFD_DOUBLEBUFFER, // double buffered
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, // color bits ignored
0, // no alpha buffer
0, // shift bit ignored
0, // no accumulation buffer
0, 0, 0, 0, // accum bits ignored
32, // 32-bit z-buffer
0, // no stencil buffer
0, // no auxiliary buffer
PFD_MAIN_PLANE, // main layer
0, // reserved
0, 0, 0 // layer masks ignored
};
int pixelformat = ChoosePixelFormat(DC, &pfd);
SetPixelFormat(DC, pixelformat, &pfd);
HGLRC hrc = wglCreateContext(DC);
ASSERT(hrc != NULL);
wglMakeCurrent(DC, hrc);
Run Code Online (Sandbox Code Playgroud)
当然这不是我所做的,它是我的代码的简化版本.好了,现在奇怪的事情开始发生了:所有初始化都很好,没有错误OnInitDialog(),但是当我点击按钮时......没有抛出任何异常.什么都没发生.完全没有.如果我在其上设置了一个断点并在其上*i = 3;按F11,则处理程序函数立即停止并将焦点返回给应用程序,该应用程序继续正常工作.我可以再次点击按钮,同样的事情会发生.
似乎有人处理了发生访问冲突的异常,并默默地将执行返回到主应用程序消息接收周期.
如果我对该行进行注释wglMakeCurrent(DC, hrc);,则所有工作都像以前一样正常,抛出异常并且Visual Studio捕获它并显示带有错误消息的窗口,之后必须终止程序.
我在安装了网站的Windows 7 64位NVIDIA GeForce 8800和最新驱动程序(11.01.2010)上遇到此问题.我的同事有32位Windows Vista并且没有这样的问题 - 抛出异常并且两种情况下应用程序崩溃.
好吧,希望好人帮助我:)
PS最初在本主题下发布的问题.
好的,我找到了一些有关此的更多信息。就我而言,Windows 7 在调用我的 WndProc 并给我执行控制权之前安装KiUserCallbackExceptionHandler作为异常处理程序。这是由ntdll!KiUserCallbackDispatcher完成的。我怀疑这是微软为了防止黑客入侵SEH而采取的安全措施。
解决方案是用 try/ except 框架包装您的 wndproc (或 hookproc),以便您可以在 Windows 之前捕获异常。
感谢 Skywing http://www.nynaeve.net/
我们已经就这个问题联系了 nVidia,但他们说这不是他们的错误,而是微软的错误。您能告诉我您是如何找到异常处理程序的吗?您是否还有一些其他信息,例如微软的一些反馈?
我在 WinDbg 中使用“!exchain”命令来获取此信息。
| 归档时间: |
|
| 查看次数: |
1676 次 |
| 最近记录: |