Visual Studio 11 的图形调试器的目标应用程序的要求

Requirements for target application for Visual Studio 11's Graphics Debugger

本文关键字:应用程序 目标 图形 Studio Visual 调试器      更新时间:2023-10-16

当Visual Studio 11发布"图形调试器"功能时,我非常高兴,我立即尝试让它在我的各种项目中运行,不幸的是,我只成功地让它在Windows 8 Metro应用程序中运行!具体来说,C++Metro项目模板运行并正确捕获所有预期信息。

使用Visual Studio的开发人员预览版和Windows 7,任何在图形调试器(Alt-F5)下启动应用程序的尝试都会在D3D11CreateDeviceAndSwapChain()上崩溃,即使它们运行良好。在我工作的Windows 8 Consumer Preview机器上的Visual Studio 11 Beta上,我得到了进一步的改进,图形调试器HUD显示正确,但任何获取捕获的尝试(应用程序中的"打印屏幕"或工具栏按钮)都只会导致一条消息(在输出日志和打开的.vsglog顶部的黄色条中):

图形诊断引擎无法提供结果,很可能是因为vsglog正在进行此计算机上不支持的DirectX调用。

从Metro模板应用程序直接移植Direct3D调用也是如此!我没有从MSDN文档中看到任何消息表明此功能仅适用于Metro,所以我认为我只是在做一些愚蠢的事情,但应用程序在不使用图形调试器的情况下可以正常工作。

其他信息:D3D11_CREATE_DEVICE_DEBUG已设置,DirectX控制面板启用Direct3D调试,我在输出中收到预期的创建/销毁信息消息,没有其他消息。

Windows 8:哈哈!通过将另一个调试器连接到图形调试器主机VsGraphicsDesktopEngine.exe(位于C:\Program Files(x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\VsGraphics\x86中),并通过DirectX控制面板强制进行Direct3D调试,我得到了输出:

DXGI错误:DXGI_SWAP_CHAIN_DESC中没有指定目标窗口,也没有与所属工厂关联的窗口。[未知错误#7:]

PIX:IDXGIFactory2::CreateSwapChainForHwnd返回887a0001

我觉得这很奇怪,因为尽管我使用的是CreateSwapChainForHwnd(),但它使用的是DXGI_SWAP_CHAIN_DESC1,它甚至没有字段OutputWindow。然而,我尝试将CreateSwapChainForHwnd()的使用与指定了OutputWindow的CreateSwapCain()进行交换,并且一切正常

经过进一步的测试,我发现在D3D11CreateDeviceAndSwapChain()上的任何尝试都失败了,它运行的适配器为空,但捕获会给人一种奇怪的感觉;此图形诊断引擎不支持D3D9。您的应用程序播放可能不完整&";,使用指定的适配器,它会与以下堆栈崩溃:

04246c83()
[Frames below may be incorrect and/or missing]
dxgi.dll!CDXGIFactory::CreateSwapChainForHwndImpl(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC_INTERNAL *,bool,struct IDXGIOutput *,struct IDXGISwapChain1 * *)
dxgi.dll!CDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
VsGraphicsHelper.dll!CHookedIDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
VsGraphicsHelper.dll!CSpyHookedIDXGIFactory::CreateSwapChain(struct IUnknown *,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *)
d3d11.dll!_D3D11CreateDeviceAndSwapChain@48()
VsGraphicsHelper.dll!CHookedD3D11Top::D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)
VsGraphicsHelper.dll!CSpyHookedD3D11Top::D3D11CreateDeviceAndSwapChain(struct IDXGIAdapter *,enum D3D_DRIVER_TYPE,struct HINSTANCE__ *,unsigned int,enum D3D_FEATURE_LEVEL *,unsigned int,unsigned int,struct DXGI_SWAP_CHAIN_DESC *,struct IDXGISwapChain * *,struct ID3D11Device * *,enum D3D_FEATURE_LEVEL *,struct ID3D11DeviceContext * *)
Win32ProjectScratch.exe!Direct3DWindowBase::CreateDeviceResources() Line 363
...

似乎只有D3D11CreateDevice()后面跟着IDXGIFactory::CreateSwapChain()才能工作——通过指定适配器或稍后查询设备的工厂。

Windows 7还有另一个问题:您必须仍然使用D3D11CreateDevice()/IDXGIFactory::CreateSwapChain(),但如果您使用DXGI 1.0工厂,它也会在第一个Present()上引发DirectX调试层错误(CreateDXGIFactory()CreateDXGIFactory1()):

D3D11:错误:ID3D11Device::CreateTexture2D:D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX仅适用于在Dxgi1.1工厂或更高版本之外创建的设备。[STATE_CREATION ERROR#103:CREATETEXTURE2D_invalidiscflags]

如果你有调试层";严重性中断";选项打开(通常情况下,您应该这样做),这将在调试器中引发一个异常,使其看起来像是另一个崩溃,但它可以安全地继续-但是您没有得到VS Graphics debugger HUD,并且对象表窗口的内容已断开。另一方面,如果你遵循它的建议并使用DXGI 1.1工厂,你会在Present()中遇到真正的崩溃。

总之,图形调试器似乎还没有完全成熟!

建议@MrGomez调试调试器

根据您提供的信息,该工具在D3D11CreateDeviceAndSwapChain中崩溃,因为抽象层在渲染过程中无法满足必要的Direct3D扩展。您引用的错误消息证实了这一点,因为当前计算机不支持请求的Direct3D调用。

MSDN提供了一篇关于此场景的帮助文章,介绍如何使用标准工具调试此过程。特别是,虽然您可能已经考虑过了,但dxdiag可以帮助您在Windows 7或Windows 8 Consumer Preview系统上调试当前运行的扩展。当Visual Studio 11崩溃时,您还应该能够保存一个崩溃转储,以便稍后进行调试,这将说明哪个进程调用失败。

请这样做,如果可能的话,用结果更新这个问题。这应该说明您的系统需要的API调用,这样我们就可以解决这个问题。