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

时间:2012-03-14 05:14:01

标签: c++ direct3d visual-studio-2012

当"图形调试器"功能是为Visual Studio 11宣布的,我立即尝试让它在我的各种项目上工作,不幸的是我只是设法使它适用于Windows 8 Metro应用程序!具体而言,C ++ Metro项目模板可以正确运行并捕获所有预期信息。

使用Visual Studio的Developer Preview版本,在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调试,我得到了预期的创建/销毁信息消息而输出中没有其他信息。

2 个答案:

答案 0 :(得分:9)

Windows 8 :A-ha!通过将另一个调试器附加到图形调试器主机VsGraphicsDesktopEngine.exe(在C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Extensions \ Microsoft \ VsGraphics \ x86中找到)并通过DirectX强制Direct3D调试控制面板,我得到了输出:

  

DXGI错误:DXGI_SWAP_CHAIN_DESC中没有指定目标窗口,也没有与拥有工厂关联的窗口。 [UNKNOWN ERROR#7:]

     

PIX:IDXGIFactory2 :: CreateSwapChainForHwnd返回887a0001

我认为这很奇怪,因为虽然我使用的是CreateSwapChainForHwnd(),但它使用DXGI_SWAP_CHAIN_DESC 1 ,甚至 字段{{1} }}。但是我尝试将CreateSwapChainForHwnd()与CreateSwapChain()交换使用指定的OutputWindow并且一切正常

经过进一步的测试,我发现D3D11CreateDeviceAndSwapChain()的任何尝试都失败了,它运行了一个空适配器,但是捕获给出了“这个图形诊断引擎不支持D3D9。你的应用程序的播放可能不完整。”,并使用指定的适配器与此堆栈崩溃:

OutputWindow

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

Windows 7 还有另一个问题:您必须使用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()上引发DirectX调试层错误如果您使用的是DXGI 1.0工厂(Present()CreateDXGIFactory() 1 CreateDXGIFactory):

  

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

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

总之,图形调试器似乎尚未完全烘焙!

向@MrGomez推荐调试调试器的想法

答案 1 :(得分:3)

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

MSDN提供a help article on this scenario,引导您使用标准工具来调试此过程。特别是,虽然您可能已经考虑过它,dxdiag可以帮助您调试系统上当前运行的扩展,以用于Windows 7或Windows 8 Consumer Preview。您还应该能够save a crash dump when Visual Studio 11 crashes进行以后的调试,这应该说明哪个进程调用失败。

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

相关问题