【问题标题】:Rebuild project without stopping debugging在不停止调试的情况下重建项目
【发布时间】:2015-09-26 12:16:45
【问题描述】:

我有一个 Visual C++ 解决方案,其中包括一个 StartUp 项目和许多由 StartUp 项目动态加载和卸载的 DLL 项目。我想在不停止当前调试会话的情况下重建 DLL 项目。但是尝试这样做会提示我“你想停止调试吗?”弹出窗口。

在项目上手动运行 msbuild 会失败:

"D:\MySolution\MyDLLProject\dllproject.vcxproj" (default target) (1) ->
(Link target) ->
  LINK : fatal error LNK1201: error writing to program database 'D:\MySolution\compiled\DebugDB\MyDLLProject\Debug\dllproject.pdb'; check for insufficient disk space, invalid path, or insufficient privilege [D:\MySolution\MyDLLProject\dllproject.vcxproj]

有没有办法绕过这个?

【问题讨论】:

  • 我不知道它是否适用于 DLL,但您是否尝试过 enable "Edit and continue"
  • 是的,我已启用它。但是对重建没有帮助。

标签: c++ visual-studio visual-studio-2012 msbuild


【解决方案1】:

您需要确保由您的新构建的 dll 生成的 pdb 文件与上次构建的不同。

使用命令行构建 dll,您可以调用编译器/链接器 使用命令行开关 -PDB:>>PDBFILENAME_%random%.pdb

这将创建一个每次重新编译时都不同的 pdb 文件。

示例: cl main.cpp -LD /link -PDB:test_%random%.pdb

【讨论】:

  • 这能让我调试新的 dll 吗?
  • 是的,我只是做了一个小测试来确认这一点。如果您构建一个新的 pdb 文件并确保在您尝试加载 dll 时该文件已完整写入,那么调试器将加载新构建的 pdb 文件的符号
  • 刚刚与我的原始项目确认这有效。太好了,谢谢。唯一的负担似乎是清理 pdb 文件,因为它们的范围接近 10 MB。我会用自动化解决这个问题。
【解决方案2】:

错误的原因是您的 MSVC 调试器当前正在使用 pdb 文件。在调试模式下构建项目时,需要覆盖这些文件,但这是不可能的,因为您无法删除当前正在使用的文件。

程序数据库 (PDB) 文件包含调试和项目状态信息,允许增量链接程序的调试配置。它还存储调试信息。

因此,如果您在没有pdb 文件的情况下构建项目,您将能够在调试时构建它。但在这种情况下,由于您的 pdb 文件已经过时,您无法调试您的应用程序。这意味着,在您应该停止调试器会话后重建您的项目并能够对其进行调试。或者,作为一个可疑的解决方案,您可以将其构建到另一个目录中以避免 pdb 文件写入冲突。

【讨论】:

  • 这是有道理的。有什么方法可以卸载数据库并重新加载符号?
  • @Tom pdb 文件由调试器自动加载 -> 没有 pdb 文件调试器无法工作,这意味着卸载 pdb 文件是停止调试会话的同义词。
  • 那很不幸,我想这超出了我的范围。我想知道不能热切换pdb文件是否有任何技术限制?
  • @Tom 问题可能会得到解决,但可能会导致另一个问题。请参阅:实际上 pdb 文件可以在删除后加载到 ram 中。但是,在大型项目的情况下,pdb 文件可能会很大并且无法加载到 RAM 中。这就是为什么,我猜,调试器只是从硬盘读取它,这使得文件应该保持不变。但是,如果您的 hotswitch 意味着加载不同的 pdb 文件,您最好向微软开发人员询问。
  • 见下面 H. Kretzschmar 的回答。不确定是否有任何可能失败的极端情况。这不是一个完美的解决方案,但有效!
【解决方案3】:

VS 内部有内置机制来防止这种情况发生。

(刚刚用 C# MVC 项目测试过)

要使用 (F5) 编译,请使用 (Ctrl + F5)。 这将编译您的解决方案,而无需将调试器附加到浏览器。

不要关闭 bowser 选项卡并返回 Visual Studio。更改控制器或类中的任何内容。 您会看到 Visual Studio 运行顺畅,就像解决方案停止时一样。

现在,按 (Ctrl + Shft + B) 调用构建机制。这将生成所有新的 dll

再次切换到浏览器并刷新页面(F5 或 Ctrl + r)

这样可以节省时间!

总结

  1. VS:Ctrl + F5
  2. chrome:渲染页面
  3. VS:更改任何内容 Ctrl + Shift + B
  4. 铬:Ctrl + r

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2011-10-31
    • 1970-01-01
    • 2015-08-26
    • 2015-01-21
    • 2010-12-09
    相关资源
    最近更新 更多