在Visual Studio 2012上调试着色器,找不到符号

时间:2012-06-21 13:18:46

标签: debugging direct3d visual-studio-2012 sharpdx

我不知道你们中是否有很多人尝试使用Visual Studio 2012的新功能来调试基于Direct3D的应用程序。

我成功捕获了我的应用程序的一个框架,然后我想调试顶点着色器的执行: enter image description here

我单击绿色三角形来调试给定的顶点,但是我找到了“No Symbol Found”消息,这阻止我调试它。

有人知道如何为Visual Studio找到符号吗?

感谢。

4 个答案:

答案 0 :(得分:4)

您需要使用调试信息编译着色器。并且为了可靠地调试,您可能还希望禁用优化。根据编译着色器的方式,这将是以下两种方式之一:

D3DCompile / D3DCompileFromFile:D3DCOMPILE_DEBUGD3DCOMPILE_SKIP_OPTIMIZATION标志传递给D3DCompile。请注意,根据D3D版本以及您是否使用D3DX,这些标志可能具有不同的前缀。

fxc.exe :编译标志具有等效的开关。对于D3DCOMPILE_DEBUG,将/Zi传递给fxc。对于D3DCOMPILE_SKIP_OPTIMIZATION,请传递/Od

Visual Studio 2012非常聪明地根据嵌入的调试信息查找着色器的源代码,但是如果它无法执行此操作,它将提示您指向相应的文件。

答案 1 :(得分:3)

使用SlimDX时,您可以将ShaderFlags传递给着色器编译器。传递ShaderFlags.Debug会导致包含调试符号。

var bytecode = ShaderBytecode.CompileFromFile("shader.fx", "VShader", "vs_4_0", ShaderFlags.Debug, EffectFlags.None)

希望它在原生Direct3D中类似。

答案 2 :(得分:3)

来自msdn

  

无法同时调试应用及其着色器代码。但是,您可以在它们之间切换

您可能正在调试应用程序并尝试同时调试着色器。

答案 3 :(得分:1)

我能够在VS2012中调试着色器。

我使用了这个命令行:

fxc /TTargetProfile /EShaderMainFunctionName /Od /Zi /FdMyShader.pdb MyShaderFile

在代码中,我使用了:

D3DX11CompileFromFile(filename, NULL, NULL, "ShaderMainFunctionName, "TargetProfile", D3D10_SHADER_DEBUG | D3D10_SHADER_SKIP_OPTIMIZATION, ...);

TargetProfile类似于vs_5_0ps_5_0

我很确定它适用于D3DCompile。

当我忘记放D3D10_SHADER_DEBUG | D3D10_SHADER_SKIP_OPTIMIZATION时,我试图手动加载pdb文件,它说符号不匹配。

当我做对了,Pixel History视图中的Pixel Shader是一个蓝色链接。当我点击它时,它会自动加载正确的文件,我可以开始调试它。

我找不到生成pdb文件的/ Fd的代码内等价项,这就是我必须通过命令行的原因。