Visual Studio Graphics Debugger генерирует исключение нарушения прав чтения - PullRequest
0 голосов
/ 08 ноября 2019

Я пишу простой рендер, использующий библиотеку d3d11 в Visual Studio 2019, и он прекрасно собирается и работает. Однако, когда я пытаюсь запустить графический отладчик, он немедленно выдает нарушение прав чтения для адреса 0x0000000000000000 (что явно неверно).

Исключение выдается из dll DXCaptureReplay в строке

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, исключение не будет сгенерировано, и я могу сделать снимки)

1 Ответ

2 голосов
/ 08 ноября 2019

Если вы включите Direct3D Debug Device, вы увидите в окне вывода отладки:

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

NULL (или еще лучше nullptr) подходит только для ppClassInstances если NumClassInstances равен 0. Попробуйте:

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

Как правило, вы должны убедиться, что ваша программа работает без вывода сообщений ERROR или CORRUPTION из уровня отладки, прежде чем пытаться использовать PIX или инструмент VSGS.

См. Документы Microsoft и в этом блоге .

...