Debugging Can';t使用集成图形调试器调试顶点或像素着色器

Debugging Can';t使用集成图形调试器调试顶点或像素着色器,debugging,graphics,visual-studio-2012,directx,Debugging,Graphics,Visual Studio 2012,Directx,我以前有能力在Visual Studio 2012中检查着色器,但现在我失去了它。用户界面实际上并没有崩溃,但“这可能需要几分钟”的无模式弹出消息从未产生效果。我在网站上找到一篇帖子,声称安装VS2012更新3解决了这个问题,但这对我的情况没有帮助 当使用Pix作为一种选项时,我发现在BeginPaint()/EndPaint()对之外进行渲染以提高速度会导致调试问题,但这一次也不是问题所在 更多信息:最初有一条警告消息,“找不到'YourApp.exe'的调试信息,或者调试信息不匹配。符号文件

我以前有能力在Visual Studio 2012中检查着色器,但现在我失去了它。用户界面实际上并没有崩溃,但“这可能需要几分钟”的无模式弹出消息从未产生效果。我在网站上找到一篇帖子,声称安装VS2012更新3解决了这个问题,但这对我的情况没有帮助

当使用Pix作为一种选项时,我发现在BeginPaint()/EndPaint()对之外进行渲染以提高速度会导致调试问题,但这一次也不是问题所在


更多信息:最初有一条警告消息,“找不到'YourApp.exe'的调试信息,或者调试信息不匹配。符号文件中没有本机符号”。正如我所预料的那样,由于主应用程序是托管的,DirectX工作通过一个非托管引擎DLL进行处理,该DLL稍晚加载(一旦我知道要使用哪个位版本)。

是否尝试调试帧中的第一个draw调用

帧越向下,在着色器执行之前进行的DirectX调用越多,调试器启动所需的时间就越长;复杂的场景可能需要很长时间


如果即使是第一个draw调用也无法启动调试,也许可以尝试注释代码以减少API调用的数量,并查看是否存在导致问题的特定操作。

结果表明,VS2013 preview可以毫不费力地调试VS2012.vsglog文件中的所有着色器(注意,express build缺少着色器的自动和监视窗口)。这当然需要windows 8.1预览。在专用虚拟机内设置这两个窗口以实现安全性需要大约8 gig(32位,VirtualBox).

Tombola,我是Visual Studio中图形调试器的开发人员。正如您所看到的,2013预览版为图形调试器添加了一些较大的稳定性和缩放改进。您以前可能看到的是在尝试启动着色器调试时播放引擎崩溃。图形调试器工具附带了一些稳定性问题VS 2012中的,但从那时起更新2和现在的VS2013(RTM也应该比预览版有相当大的改进)对这一问题有很大的帮助。

您能否提供更多详细信息,说明启动调试着色器的具体操作(启动IDE时的按钮/命令),您期望看到的内容和实际看到的内容。您的应用程序在未连接调试程序的情况下是否工作正常?(直接启动可执行文件)是否使用BeginPaint()/EndPaint()在当前项目中?为什么?它不是DirectX函数。应用程序本身在有调试器和没有调试器的情况下运行良好。开始/结束绘制调用基本上是遗留代码,因为引擎一度基于GDI。我正在使用调试/图形/开始诊断,并通过打印屏幕捕获。调试器显示渲染和事件列表ally,但是在管道视图、像素历史记录等中,任何单击着色器的尝试都会导致等待消息永远翻滚,因此着色器的预期列表永远不会出现。UI的其余部分没有挂起,只是被消息遮住了。嗯,看起来你做得很好。尝试注释所有绘图代码,制作一个假绘图()在事件列表中调用并单击它。若要检查它是否是您的代码问题,请尝试调试任何其他(DirectX示例)或者只编写您自己的测试。不太合理,但可能有帮助:在设备创建时,您是否传递了除<代码>D3D11\u创建\u设备\u调试之外的任何标志?着色器是否使用调试信息编译?您最近是否安装了图形驱动程序(尝试回滚)?您是否在输出窗口中收到来自D3D11调试层的任何警告?我仍在研究这些想法,但SDK示例是可调试的。有一个调试层警告出现了几次,
D3D11警告:ID3D11Buffer::SetPrivateData:找到了同名但大小不同的现有私有数据![状态设置警告#55:SETPRIVATEDATA_CHANGINGPARAMS]
。这是由于为资源设置调试名称造成的。我自己的经验是:SETPRIVATEDATA\u CHANGINGPARAMS本身并不危险,但它可能会指出严重的隐藏设计错误或代码流错误:您多次命名资源,但大多数情况下您只想在创建后这样做一次。那么,第二次发生在哪里?cr呢eation也是第二次出现?还有其他一些?可能是关键。我认为您必须深入研究函数调用图,看看代码是否以您不期望的方式流动。第一次绘制不会调试。因此,它甚至不会深入到事件列表顶部附近的调用,如CreateVertexShader()。这些调用会产生类似的“正在收集对象数据。这可能需要几分钟”消息,但该消息不起作用。