2017-11-11 195 views
-1
OpenGL應用程序

這個問題纔開始更新的Windows 10到1703版本之後發生的事情,程序工作正常的版本1607導致堆棧溢出d3d11.dll

在創建一個OpenGL 4.6上下文,堆棧溢出異常被觸發在調用SwapBuffers()時在d3d11.dll中。以下是堆棧內容的總結(從下往上閱讀)。爲什麼我的純粹的OpenGL程序調用d3d11.dll中的函數?我不知道如何去調試這個,任何提示將不勝感激。

系統規格:的GeForce GT 745A與驅動版本388.13中,Windows 10版本1703,酷睿i7 4790S,8GB RAM

編輯:加載符號,得到了一個更加有用的調用堆棧:

d3d11.dll!NDXGI::CDevice::SubmitCommandCB(void *,struct _D3DDDICB_SUBMITCOMMAND const *) Unknown 
-- This block repeats several times... 
nvwgf2umx.dll!00007ffdd4a226d5() Unknown 
nvwgf2umx.dll!00007ffdd4a18830() Unknown 
nvwgf2umx.dll!00007ffdd4a2363d() Unknown 
nvwgf2umx.dll!00007ffdd4d60d27() Unknown 
nvwgf2umx.dll!00007ffdd4a226d5() Unknown 
------------------------------------------- 
nvwgf2umx.dll!00007ffdd4a18830() Unknown 
nvwgf2umx.dll!00007ffdd4a2363d() Unknown 
nvwgf2umx.dll!00007ffdd4d60d27() Unknown 
nvwgf2umx.dll!00007ffdd4194afb() Unknown 
nvwgf2umx.dll!00007ffdd418e57e() Unknown 
nvwgf2umx.dll!00007ffdd41b3f1d() Unknown 
nvwgf2umx.dll!00007ffdd4183518() Unknown 
nvwgf2umx.dll!00007ffdd4183750() Unknown 
d3d11.dll!NDXGI::CDevice::CreateDriverInstance(void *,void *,void *,void *,bool,bool,enum D3D_FEATURE_LEVEL,unsigned int,long (**)(struct D3D10DDI_HDEVICE,unsigned int,unsigned __int64,void *,unsigned __int64,void *)) Unknown 
d3d11.dll!CDevice::CreateDriverInstance(class CContext *,void *,void *,void *,void *,unsigned int,long (**)(struct D3D10DDI_HDEVICE,unsigned int,unsigned __int64,void *,unsigned __int64,void *)) Unknown 
d3d11.dll!CContext::LUCCompleteLayerConstruction(void) Unknown 
d3d11.dll!NOutermost::CDeviceChild::LUCCompleteLayerConstruction(void) Unknown 
d3d11.dll!NOutermost::CDevice::CreateLayeredChild(unsigned int,void const *,unsigned __int64,struct ID3D11LayeredUseCounted *,struct _GUID const &,void * *) Unknown 
d3d11.dll!CDevice::LLOCompleteLayerConstruction(void) Unknown 
d3d11.dll!NDXGI::CDevice::LLOCompleteLayerConstruction(void) Unknown 
d3d11.dll!NOutermost::CDevice::FinalConstruct(struct NOutermost::CDevice::TConstructorArgs const &) Unknown 
d3d11.dll!TComObject<class NOutermost::CDevice>::TComObject<class NOutermost::CDevice>(void *,struct NOutermost::CDevice::TConstructorArgs const &,struct _GUID const &,void * *) Unknown 
d3d11.dll!TComObject<class NOutermost::CDevice>::CreateInstance(struct NOutermost::CDevice::TConstructorArgs const &,void *,void *,struct _GUID const &,void * *) Unknown 
d3d11.dll!D3D11CreateLayeredDevice(unsigned int,void const *,unsigned __int64,struct ID3D11LayeredDevice *,struct _GUID const &,void * *) Unknown 
d3d11.dll!D3D11CoreCreateLayeredDevice() Unknown 
d3d11.dll!D3D11RegisterLayersAndCreateDevice(struct D3D11_EXTENSIONS const &,class NDXGI::CUMDAdapter *,enum D3D_FEATURE_LEVEL,enum D3D_FEATURE_LEVEL,unsigned __int64,unsigned int,struct ID3D11Device * *) Unknown 
d3d11.dll!D3D11CoreCreateDevice() Unknown 
d3d11.dll!D3D11CreateDeviceAndSwapChainImpl(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL const *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC const *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *) Unknown 
d3d11.dll!D3D11CreateDeviceAndSwapChain() Unknown 
d3d11.dll!D3D11CreateDeviceImpl(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL const *,unsigned int,unsigned int,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *) Unknown 
d3d11.dll!D3D11CreateDevice() Unknown 
nvoglv64.dll!0000000058f193a9() Unknown 
nvoglv64.dll!0000000058f18438() Unknown 
nvoglv64.dll!0000000058f40b8e() Unknown 
nvoglv64.dll!0000000058f3fcd3() Unknown 
nvoglv64.dll!0000000058f22607() Unknown 
nvoglv64.dll!0000000058f41a42() Unknown 
nvoglv64.dll!00000000590291fd() Unknown 
nvoglv64.dll!000000005903437d() Unknown 
nvoglv64.dll!00000000590452e7() Unknown 
nvoglv64.dll!0000000058ee8ffe() Unknown 
nvoglv64.dll!00000000590095e2() Unknown 
nvoglv64.dll!0000000058febb4d() Unknown 
nvoglv64.dll!0000000058febc60() Unknown 
nvoglv64.dll!0000000058ef9e66() Unknown 
nvoglv64.dll!0000000058ef9fd5() Unknown 
nvoglv64.dll!0000000058ef9dc4() Unknown 
nvoglv64.dll!0000000058ef98c6() Unknown 
nvoglv64.dll!0000000058ee355a() Unknown 
opengl32.dll!wglSwapBuffers() Unknown 
gdi32full.dll!SwapBuffers() Unknown 

回答

3

直到仔細檢查代碼和相關的輸入數據,我們只能推測可能的原因。

查看調用鏈中的重複塊,您可能在驅動程序中的某處發生了無限遞歸,從而觸發了堆棧。這可能是由於傳遞給OpenGL API調用的錯誤參數或OpenGL實現中的錯誤引起的。在指責Nvidia或Microsoft之前,您應該徹底檢查您的程序。爲了調試此錯誤,您可以嘗試以下操作:

  • 在執行其他任何操作之前,請執行適當的OpenGL錯誤檢查。 確保您從所有OpenGL調用中檢索返回代碼,檢查它們是否失敗,打印調試消息並觸發斷點或在這些調用失敗時終止程序(請參閱,例如here)。在調試模式下實現調試回調擴展,如here
  • 在傳統C++調試器下運行程序,就像Visual Studio中的程序一樣。檢查堆棧,並堆積可能的腐敗。啓用更多編譯器警告,嘗試各種靜態代碼檢查器和運行時分析器(如果它們能夠發現任何可疑內容)。
  • 下的圖形調試器中運行的程序,如Nvidia Nsight並尋找API調用可能出現的錯誤,對管道的各個階段和着色器
  • 查找和隔離的OpenGL函數調用導致錯誤。逐漸刪除或註釋出最可疑的代碼片段(例如,更接近崩潰的代碼,使用堆內存的代碼等)。看看錯誤是否消失。如果是這樣,比你可能已經刪除導致錯誤的代碼。將它帶回來,看看是否再次出現錯誤。從大量代碼開始,逐漸減少您刪除的代碼量,以使搜索更精確。最終目標是提出一個minimal code example重現錯誤。
  • 當你找到它時,在StackOverflow上發佈這個最小的代碼(例如添加到你的問題作爲更新),以便社區可以檢查出來。
  • 如果您的最小示例中沒有錯誤,但它崩潰,請將錯誤報告(包括最低示例代碼)提交給Nvidia。同時您也可以嘗試不同的驅動程序版本以查看它們是否受到影響。
  • 您也可以嘗試在Intel或AMD圖形上運行代碼。例如,您的英特爾圖形集成到您的CPU中。如果在另一個GPU上也可以觀察到問題,那很可能不是Nvidia的錯誤(兩個不同的供應商在同一個地方發生同樣的錯誤的可能性不大)
  • 如果您的代碼可跨操作系統移植,或者至少最簡單的例子是,嘗試在另一個操作系統上構建並運行它。 Linux有優秀的工具來調試C++代碼。有時簡單地改變編譯器就會發現很多明顯的錯誤。此外,您還將擁有valgrind,clang消毒器和OpenGL堆棧的不同實現,包括圖形驅動程序(例如,Nvidia驅動程序有兩種不同的實現方式,Nvidia專有,開放源代碼Nouveau驅動程序)。 Linux上也有與OpenGL相關的調試工具。
  • 請注意,在解析您的代碼以嘗試隔離錯誤的呼叫時,您可能找不到一個代碼,因爲在某些情況下,需要多次調用才能解決問題。這些調用可能彼此相鄰,或者它們可能分佈在多個渲染幀中。使用多線程和/或多個上下文時,事情變得特別困難。在這些情況下,最小化代碼量,刪除線程和上下文應該有所幫助。
  • 請注意,錯誤未出現在您以前的配置(例如不同的Windows版本)或其他供應商的OpenGL實現上並不一定表示沒有錯誤。它可能被隱藏或被不同的實現忽略。一些錯誤可能不會表現出來,直到滿足特定的條件。您嘗試的配置越多(操作系統,編譯器,OpenGL實現,驅動程序),您能夠暴露的錯誤就越多。希望上面的提示可以幫助您找到這些錯誤和情況。

快速調試!