启动Visual Studio图形诊断时触发Access Violation异常求助
针对DirectX 11项目VS图形诊断触发D3D12Core.dll访问违例的排查方案
1. 强制图形诊断使用D3D11捕获路径
VS图形诊断的MONZA引擎在双GPU环境下可能默认走D3D12捕获逻辑,即使项目基于D3D11开发。可手动指定捕获模式:
- 右键项目 → 属性 → 调试 → 图形诊断,找到“捕获目标”选项,强制设置为Direct3D 11而非自动检测;
- 若属性中无此选项,可在调试启动前,点击VS工具栏的“图形诊断”下拉菜单,选择“启动图形诊断(仅限Direct3D 11)”。
2. 重置图形诊断缓存与修复MONZA组件
MONZA异常是触发后续D3D12访问违例的根源,可通过以下步骤重置:
- 关闭VS,删除目录
%LOCALAPPDATA%\Microsoft\VisualStudio\17.0_<你的VS实例ID>\GraphicsDiagnostics下的所有缓存文件; - 打开VS安装程序,选择“修改”,先移除“图形诊断工具”组件,重启后重新添加该组件,确保组件文件完整。
3. 手动指定调试时使用的GPU
双GPU环境下,VS调试可能未正确识别默认GPU,需在代码中强制绑定NVIDIA适配器:
#include <dxgi.h> #pragma comment(lib, "dxgi.lib") // 初始化D3D设备前手动选择NVIDIA GPU IDXGIFactory1* pFactory = nullptr; HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&pFactory)); if (SUCCEEDED(hr)) { IDXGIAdapter* pAdapter = nullptr; for (UINT i = 0; pFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i) { DXGI_ADAPTER_DESC adapterDesc; pAdapter->GetDesc(&adapterDesc); // 匹配NVIDIA显卡 if (wcsstr(adapterDesc.Description, L"NVIDIA") != nullptr) { break; } pAdapter->Release(); pAdapter = nullptr; } // 使用选中的适配器创建D3D11设备 ID3D11Device* pDevice = nullptr; ID3D11DeviceContext* pContext = nullptr; hr = D3D11CreateDevice(pAdapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, D3D11_CREATE_DEVICE_DEBUG, nullptr, 0, D3D11_SDK_VERSION, &pDevice, nullptr, &pContext); if (pAdapter) pAdapter->Release(); pFactory->Release(); }
4. 升级Visual Studio版本
VS 2022 17.6.5存在图形诊断与双GPU环境兼容的已知问题,建议升级至17.10及以上版本,或回退到17.5版本测试,新版本修复了多个MONZA引擎和D3D组件交互的bug。
内容的提问来源于stack exchange,提问作者IT Tech
相关产品推荐
相关产品推荐

