Visual Studio 图形调试器引发读取访问冲突异常

东方将军

我正在使用 Visual Studio 2019 中的 d3d11 库编写一个简单的渲染器,它构建和运行良好。但是,当我尝试运行图形调试器时,它立即引发地址 0x0000000000000000(显然不正确)的读取访问冲突。

从DXCaptureReplay dll抛出异常就行了

DeviceContext.PSSetShader(InShaderToBind.Shader.PS, NULL, 1);

其中 InShaderToBind.Shader.PS 是指向 ID3D11PixelShader 的指针

当我因为缺乏想法而尝试时,它变得最奇怪

int X = 0;
ID3D11ClassInstance* FakedClassInstance = reinterpret_cast<ID3D11ClassInstance*>(&X);

DeviceContext.PSSetShader(InShaderToBind.Shader.PS, &FakedClassInstance, 1);

因为这将使异常在我尝试捕获帧之前不会抛出(我认为这是有道理的,因为该指针仅对 X 仍然有效的范围有效)

MSDN 文档指出 NULL 应该是传递给 PSSetShader 的完全有效的参数(如此处所述:https ://docs.microsoft.com/en-us/windows/win32/api/d3d11/nf-d3d11-id3d11devicecontext-pssetshader )

关于可能出什么问题的任何想法?

(如果我注释掉 PSSetShader,则不会抛出异常,我可以进行捕获)

查克·沃尔伯恩

如果启用 Direct3D 调试设备,您将在调试输出窗口中看到:

D3D11 CORRUPTION: ID3D11DeviceContext::PSSetShader: Second parameter (ppClassInstances) corrupt or unexpectedly NULL. [ MISCELLANEOUS CORRUPTION #14: CORRUPTED_PARAMETER2]

NULL(或更好nullptrppClassInstances 当 NumClassInstances 为 0时才适用。尝试:

DeviceContext.PSSetShader(InShaderToBind.Shader.PS, NULL, 0);

通常,在尝试使用 PIX 或 VSGS 工具之前,您应该确保程序运行时不会从调试层发出 ERROR 或 CORRUPTION 消息。

请参阅Microsoft Docs此博客文章

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章