OpenGL应用程序导致d3d11.dll中的堆栈溢出[关闭]

Posted

技术标签:

【中文标题】OpenGL应用程序导致d3d11.dll中的堆栈溢出[关闭]【英文标题】:OpenGL application causing Stack Overflow in d3d11.dll [closed] 【发布时间】:2017-11-11 02:57:47 【问题描述】:

此问题仅在将 Windows 10 更新到版本 1703 后才开始出现,该程序在版本 1607 上运行良好。

在创建 OpenGL 4.6 上下文时,调用 SwapBuffers() 时会在 d3d11.dll 中触发堆栈溢出异常。下面是堆栈内容的摘要(从下往上读取)。为什么我的纯 OpenGL 程序会调用 d3d11.dll 中的函数?我什至不知道如何调试这个,任何提示将不胜感激。

系统规格:GeForce GT 745A,驱动版本 388.13,Windows 10 版本 1703,i7 4790S,8GB 内存

编辑:加载符号,得到一个更有用的调用堆栈:

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

【问题讨论】:

【参考方案1】:

在彻底检查代码和相关输入数据之前,我们只能推测可能的原因。

查看调用链中的重复块,您可能已经在驱动程序的某处以无限递归命中堆栈。这可能是由于传递给 OpenGL API 调用的错误参数或由于 OpenGL 实现中的错误所致。在指责 Nvidia 或 Microsoft 之前,您应该彻底检查您的程序。为了调试此错误,您可以尝试以下操作:

首先,实施正确的 OpenGL 错误检查。 确保从所有 OpenGL 调用中检索返回码,检查它们是否失败,打印调试消息并触发断点,或者如果这些调用中的任何一个失败则终止程序(参见例如here)。在调试模式下实现调试回调扩展,如here。 在常规 C++ 调试器下运行程序,如 Visual Studio 中的调试器。检查堆栈和堆是否可能损坏。启用更多编译器警告,尝试各种静态代码检查器和运行时分析器,如果它们发现任何可疑之处。 在图形调试器下运行程序,例如Nvidia Nsight,并在 API 调用、管道的各个阶段和着色器中查找可能的错误 查找并隔离导致错误的 OpenGL 函数调用。逐渐删除或注释掉看起来最可疑的代码片段(例如更接近崩溃的代码、使用堆内存的代码等)。看看错误是否消失。如果是这样,那么您可能已经删除了导致错误的代码。把它拿回来,看看是否再次出现错误。从大块代码开始,逐渐减少删除的代码量,使搜索更精确。最终目标是提出一个重现错误的minimal code example。 找到后,将这个最少的代码发布到 *** 上(例如,作为更新添加到您的问题中),以便社区可以查看。 如果您的最小示例中没有错误,但它崩溃了,请向 Nvidia 提交错误报告,包括最小示例代码。同时您也可以尝试不同的驱动版本,看看是否受到影响。 您也可以尝试在 Intel 或 AMD 显卡上运行代码。例如,您的 CPU 中集成了 Intel 显卡。如果问题在另一个 GPU 上也可以观察到,那么很可能不是 Nvidia 的错(两个不同的供应商不太可能在同一个地方犯同样的错误) 如果您的代码可以跨操作系统移植,或者至少在最小示例中是可移植的,请尝试在另一个操作系统上构建和运行它。 Linux 拥有出色的工具来调试 C++ 代码。有时简单地更改编译器会发现很多明显的错误。此外,您将拥有 valgrind、clang sanitizers 和 OpenGL 堆栈的不同实现,包括图形驱动程序(例如,Nvidia 驱动程序有两种不同的实现,Nvidia 专有和开源 Nouveau 驱动程序)。 Linux 上也有 OpenGL 相关的调试工具。 请注意,在剖析代码以尝试隔离错误调用时,您可能找不到一个,因为在某些情况下需要多个调用才能导致问题。这些调用可能彼此相邻,或者它们可能分布在多个渲染帧中。当使用多线程和/或多个上下文时,事情变得特别困难。在这些情况下,尽量减少代码量、移除线程和上下文应该会有所帮助。 请注意,错误未出现在您之前的配置(例如不同的 Windows 版本)或其他供应商的 OpenGL 实现中,并不一定意味着没有错误。它可能被不同的实现隐藏或忽略。在满足非常具体的条件之前,某些错误可能不会出现。您尝试的配置越多(操作系统、编译器、OpenGL 实现、驱动程序),您能够暴露的错误就越多。希望以上提示可以帮助您找到这些错误和条件。

调试愉快!

【讨论】:

以上是关于OpenGL应用程序导致d3d11.dll中的堆栈溢出[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

玩极品飞车16无法定位程序输入点 createdxgifactory2于动态链接库C:\Windows\System32\d3d11.dll

无法定位程序输入点CreateDXGIFactory2于动态链接库C\windows\SYSTEM32\d3d11.dll

Qt+Windows,Windows 底层默认使用d3d还是opengl?

WRL::ComPtr 导致 d3d 中的对象泄漏?

CSOL OpenGL与D3D哪个好?

openGL之API学习(一七四)如何兼容opengl和d3d