Visual Studio 2013在附加调试器时锁定PDB文件

时间:2015-04-15 12:37:55

标签: c# visual-studio-2013 msbuild

我正在开发一个从团队基础服务器到临时文件夹检索大量解决方案的项目,使用Microsoft.Build.Execution.BuildManager.Build为这些解决方案构建发布版本,并清理之后用源代码打开临时文件夹。

运行附带调试器的项目时出现问题: 在清理过程中,我得到一个带有消息

的system.UnauthorizedAccessException
  

"访问路径... \ obj \ release \ CalithaLibrary.pdb被拒绝"。

使用sysinternals Process Explorer我发现锁是devenv.exe获取的。

当我构建项目的发布版本并在visual studio之外运行时,问题不会出现。

为什么Visual Studio会获取属于Visual Studio从未打开过的项目的PDB锁定的任何想法?

编辑:我收到的第一个答案让我觉得我可能对这种情况不够清楚:

我正在调试一个名为" AutoReleaseService.exe"的项目。它使用Microsoft.Build.Execution.Buildmanager构建(但不运行或调试!)许多其他项目,其中包括CalithaLibrary。

如果我试图从我自己的项目中删除AutoReleaseService.pdb,事实上,附加调试器,我理解,但是锁定的pdb文件所属的项目没有&甚至在我的机器上运行,更不用说调试了。我只建造了这个项目。

2 个答案:

答案 0 :(得分:1)

  

我正在调试名为“AutoReleaseService.exe”的项目,该项目使用Microsoft.Build.Execution.Buildmanager来构建(但不运行或调试!)许多其他项目,其中包括CalithaLibrary。

好吧,CalithaLibrary看起来像一个DLL项目,当你运行AutoReleaseService.exe时,肯定会使用它。它很简单 - 当exe项目运行时,它使用它所依赖的所有dll-s。 Visual Studio(devenv.exe)锁定.pdb文件,因为它们是调试应用程序时源代码和可执行文件之间的链接,如果从Visual Studio外部打开可执行文件 - 它们不会被锁定,因为您那时候不需要它们。

答案 1 :(得分:0)

我开始变得非常确定在某处某处存在MSBuild中的错误。

幸运的是,我设法通过排除它正在制作的一些构建来调试我需要调试的应用程序的最后一部分,所以它现在在Release中运行并且不再遇到问题。

有关我认为一定是个错误的原因的一些信息。

我的应用程序的工作流程是这样的:

  • 在Team Foundation Server上创建临时工作区

  • 从TFS获取许多解决方案/项目到临时文件夹

  • 构建其中一些(可通过xml配置,但不在此处)到另一个临时文件夹

  • 使用源代码

  • 清理临时文件夹

我尝试将MSBuild选项“DebugType”设置为none,将“DebugSymbols”设置为false,但由于某种原因,它一直在输出程序数据库文件,这就是我认为某处存在错误的原因。

每当我跳过“建筑”步骤并直接跳到“清理”时,任何文件都没有锁定。