Visual Studio 11 图形调试器的目标应用程序要求
Posted
技术标签:
【中文标题】Visual Studio 11 图形调试器的目标应用程序要求【英文标题】:Requirements for target application for Visual Studio 11's Graphics Debugger 【发布时间】:2012-03-30 13:52:28 【问题描述】:当宣布 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 调试,我在输出中收到预期的 Create/Destroy 信息性消息。
【问题讨论】:
您是否也考虑将此问题作为反馈报告给 Microsoft 以及相关的预览论坛和邮件列表?微软的实际员工可能更能回答这个问题。 Microsoft VS 调试器论坛上有一个指向此处的链接。我环顾四周,但还没有找到接近 VS 调试器的人的电子邮件/博客 - 不过我仍在寻找。 我很乐意代表您询问我的专业联系人。我认识一些与调试团队关系密切的人,他们可能会为您提供比我在下面提供的公认通用答案更好的答案。 【参考方案1】:根据您提供的信息,该工具在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 调用,以便我们解决此问题。
【讨论】:
全面披露:我不是微软员工,所以心理调试的艺术让我失望。 :) 我不确定当 VS 没有崩溃时如何捕获崩溃转储 - 如果我调试 VS,大概我可以捕获第一次机会异常。 D3D10 取消了有利于功能级别的扩展(谢天谢地!),所以我不希望出现这种情况 - 但我可以尝试软件/WARP 等.... 我明白了。原谅我的困惑。当然,困难在于您正在尝试调试图形调试器,它本身在图形失败中失败,没有其他信息。哦,循环依赖的乐趣。我可以安全地假设您在 this entire help tree 上被屏蔽,包括相关主题中的每个分支,最多可达三层? 另外:如果不违反 VS2011 提供的服务条款,当您尝试研究系统依赖性问题时,正确的解决方案可能是将进程挂接到动态反汇编程序中,如 @987654325 @ 或 IDA Pro 单步执行执行链并根除问题。显然,由于各种法律和法律限制,这是最后的手段。 IANAL,但如果 Microsoft 授予社区测试人员研究例外,则可以这样做。 设法解决了 - 感谢您的帮助/用棍子戳我!享受积分:)【参考方案2】: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() 的使用与 CreateSwapChain() 交换,并指定 OutputWindow
并且 一切正常!
通过进一步的测试,我发现 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,它也会在第一个 Present()
上引发 DirectX 调试层错误1.0 工厂(CreateDXGIFactory()
与 CreateDXGIFactory
1()
):
D3D11: ERROR: ID3D11Device::CreateTexture2D: D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX 仅适用于从 Dxgi1.1 工厂或更高版本创建的设备。 [ STATE_CREATION 错误 #103:CREATETEXTURE2D_INVALIDMISCFLAGS ]
如果您打开了调试层的“严重性中断”选项(通常,您应该这样做),这将在调试器中引发异常,使其看起来像另一个崩溃,但它是安全可继续的 - 无论您如何没有得到 VS Graphics Debugger HUD,并且对象表窗口有损坏的内容。另一方面,如果您遵循它的建议并使用 DXGI 1.1 工厂,您会在 Present() 中遇到真正的崩溃。
总之,图形调试器似乎还没有完全成熟!
向@MrGomez 提出调试调试器的建议
【讨论】:
我也查看了其他答案,但我不太明白 - 您究竟如何将调试器附加到 VsGraphicsDesktopEngine.exe,然后再将其附加到您的项目?跨度> @ReiMiyasaka:很简单,启动第一个实例,启动图形调试,然后启动另一个实例,然后使用“附加到进程”来调试第一个VS启动的VsGraphicsDesktopEngine.exe。 (附加只显示在某些 UI 配置中:如果它不在“调试”菜单下,我建议重新加载“常规开发”设置)以上是关于Visual Studio 11 图形调试器的目标应用程序要求的主要内容,如果未能解决你的问题,请参考以下文章