簡體   English   中英

OpenGL抑制MFC基於對話框的應用程序中的異常

[英]OpenGL suppresses exceptions in MFC dialog-based application

我有一個使用MSVS2005創建的基於MFC驅動的基於對話框的應用程序。 這是我一步一步的問題。 我的對話框上有按鈕和相應的點擊處理程序,代碼如下:

int* i = 0;
*i = 3;

我正在運行程序的調試版本,當我點擊按鈕時,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);

當然這不是我所做的,它是我的代碼的簡化版本。 好吧現在奇怪的事情開始發生了:所有初始化都很好, OnInitDialog()中沒有錯誤,但是當我點擊按鈕時......沒有拋出任何異常。 什么都沒發生。 完全沒有。 如果我在*i = 3;處設置斷點*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”命令來獲取此信息。

您可以使用向量異常處理,而不是包裝WndProc或掛鈎所有WndProcs:

http://msdn.microsoft.com/en-us/library/ms679274.aspx

首先,兩種行為都是正確的。 取消引用空指針是“未定義的行為”,而不是保證的訪問沖突。

首先,找出這是與拋出異常有關還是僅與訪問內存位置零有關(嘗試不同的異常)。

如果將Visual Studio配置為在第一次機會訪問沖突時停止,它是否會中斷?

在glMakeCurrent之前和之后調用VirtualQuery(NULL,...)並進行比較。 也許nVidia OpenGL驅動VirtualAlloc頁面零(一個壞主意,但不是不可能或非法)。

我有類似的行為(nVidia的驅動程序安裝了一個矢量異常處理程序,最終導致崩潰),請參閱: https//stackoverflow.com/questions/4876796/why-does-an-exception-handled-by-nvidias-opengl -driver功能於copydown-的memmove晚期

它在安裝最新的nVidia驅動程序時消失了(2011年1月)。

當我看到類似的問題時,我發現了這個問題。 在64位Windows上運行32位應用程序時,我們的問題變成了異常的異常消耗。

http://connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught-in-wndproc-messages

有一個可以從Microsoft獲得的修復程序,但如果您有多個目標平台,那么部署它會有些挑戰:

http://support.microsoft.com/kb/976038

這是一篇關於描述行為的主題的文章:

http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/

堆棧溢出上的這個線程也描述了我遇到的問題: Windows默默捕獲的異常,如何手動處理?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM