Visual Studio Graphics Debugger抛出读取访问冲突异常

问题描述 投票:0回答:1

我正在使用Visual Studio 2019中的d3d11库编写一个简单的渲染器,它可以正常运行。但是,当我尝试运行Graphics Debugger时,它立即引发对地址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,则不会引发异常,并且可以进行捕获)

c++ visual-studio-2019 directx-11
1个回答
0
投票

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

D3D11 CORRUPTION: ID3D11DeviceContext::PSSetShader: Second parameter (ppClassInstances) corrupt or unexpectedly NULL. [ MISCELLANEOUS CORRUPTION #14: CORRUPTED_PARAMETER2]
如果NumClassInstances为0,对于NULL

only,nullptr(或更好的是ppClassInstances)很好。尝试:

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

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

请参见Microsoft Docsthis blog post

© www.soinside.com 2019 - 2024. All rights reserved.