Visual Studio bin \ debug文件夹中的PDB文件

时间:2008-09-25 11:26:33

标签: visual-studio build-process pdb-files

我有一个VS(2008)解决方案,包含多个项目,而不是所有项目都在同一名称空间中。构建解决方案时,顶级项目 TopProject 使用的所有dll都将复制到 TopProject \ bin \ debug 文件夹中。但是,仅为某些其他项目复制相应的.pdb文件。这很痛苦,例如在使用NDepend时。

VS如何决定将哪些.pdb文件复制到更高级别的bin \ debug文件夹中?我怎样才能让VS复制其他人?


编辑:

引用如下:所有dll都复制到一个中心位置,没有它们的pdbs。 TopProject 引用了这些复制的dll;然而,dll本身显然知道他们的pdbs在哪里,并且(大部分)被正确地复制到调试文件夹。

4 个答案:

答案 0 :(得分:11)

来自MSDN

  

程序数据库(PDB)文件成立   调试和项目状态   允许增量的信息   链接的Debug配置   你的计划。创建PDB文件   当你编译一个C / C ++程序时   / ZI或/ Zi或Visual   Basic / C#/ JScript .NET程序   /调试。

所以看起来这里的“问题”(缺少一个更好的词)是你的一些DLL是在调试模式下构建的(因此发出PDB),有些是在发布模式下构建的(因此不是发射PDB)。如果是这种情况,应该很容易修复 - 进入每个项目并更新其构建设置。如果您没有对命令行选项进行任何调整,那么这将是默认方案。

然而,如果不是这样,那将会变得更加棘手。也许你们都处于发布或调试模式。现在,您需要查看每个项目的命令行编译选项(在项目属性中指定)。如果需要调试器,请将它们更新为/ debug,如果不需要,则将其删除。

编辑以响应编辑

是的,DLL“知道”他们有PDB,并且有路径,但这并不意味着太多。正如其他人所提到的那样,只将DLL复制到给定目录,不会清除这个问题。您也需要PDB。

在Windows中复制单个文件,但某些“捆绑”类型文件除外(我不是微软的术语,但“完整的HTML包”是概念)不复制相关文件。 DLL没有以“捆绑”的方式组装,因此复制它们会使PDB落后。

我要说的唯一的答案就是更新你的DLL进入那些中心位置的过程,并包括PDB ......但我很乐意被证明是错误的!

答案 1 :(得分:3)

正如其他帖子所说,您可能遇到编译器/损坏问题。

但是,正如威尔所说,如果正在创建pdb文件,但没有显示出你想要它们的位置,请创建一个构建后步骤。这是我为解决方案中的每个项目定义的构建后步骤。它确保将所有输出文件复制到一个公共目录。

如果你的proj文件在\ SolutionDir \ ProjDir中,那么构建后步骤的第一行会将输出文件复制到\ Solution \ Bin \ Release或\ Solution \ Bin \ Debug。 如果这是一个Debug构建,第二行将复制pdb文件。我没有为发布版本复制pdb文件。

因此,\ SolutionDir \ Bin现在包含一个位置的所有输出文件。

xcopy /r /y $(TargetPath) $(ProjectDir)..\$(OutDir)
if $(ConfigurationName) == Debug xcopy /r /y $(TargetDir)$(TargetName).pdb $(ProjectDir)..\$(OutDir)

答案 2 :(得分:2)

首先,永远不要假设任何事情。清理解决方案,在调试模式下重建它,并检查是否已创建所有pdb文件。如果没有,那就是你的问题。

如果它们已创建,并且它们并非全部被复制,您可以通过创建手动将pdb文件手动复制到所需位置的后期构建事件来解决此问题。当然,这只是一种解决方法。

我唯一能想到的是你的解决方案文件已经损坏了。您可以将.sln作为xml文件打开并检查内容。检查按预期执行的项目的配置,并将它们与不符合预期的项目进行比较。如果您没有看到任何内容,则必须在项目级别重复此操作。比较工作.csproj(或其他)项目文件和非工作文件。


编辑以响应修改

如果你只是手动复制周围的东西,那么也要手动复制pdbs。我相信,Dll不应该“知道”关于pdbs的任何事情。只需将它们粘在目的地目录中即可享用一杯咖啡。放松。

答案 3 :(得分:2)

检查清洁溶液的时间,确切清洁溶液。我已经看到VS将文件挂在bin \ debug目录中,即使在清理之后也是如此。删除所有项目上的bin \ debug目录并重建。