Visual Studio 11 的图形调试器的目标应用程序的要求
Requirements for target application for Visual Studio 11's Graphics Debugger
当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()
与CreateDXGIFactory
1()
):
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调用,这样我们就可以解决这个问题。
- 试图在visual studio上用C++创建一个桌面应用程序
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 在C应用程序中运行C++(带有STL)函数
- 使用VerQueryValue检索应用程序的文件描述
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- 使用调试/崩溃报告将应用程序部署到客户端
- C++控制台应用程序阻止退出
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 在构建 Android 应用程序时禁用 CMake 目标
- 开发C++应用程序,目标服务器有不同的std lib版本,最佳实践是什么
- 其他静态阵列破坏了OMAPL138目标(CCS5.2)上的DSP应用程序
- 从注入的dll调用BeginPaint时失败,即使在目标应用程序中调用了EndPaint之后也是如此
- 如何获取目标应用程序的tcp/udp端口列表
- Visual Studio 11 的图形调试器的目标应用程序的要求
- 如何为主机应用程序和任何使用过的库使用单独的CMake目标
- 在Mac OSX上为i386目标构建Apache Thrift应用程序失败
- 如何在另一个CMake目标中加载主应用程序的接口类
- 为什么我们要为c++应用程序构建64位目标?
- 更改已编译应用程序中的嵌入式目标端口
- 拖放Qt:知道目标应用程序悬停-是可能的