【问题标题】:Why is msbuild and link.exe "hanging" during a build?为什么 msbuild 和 link.exe 在构建过程中“挂起”?
【发布时间】:2010-11-08 00:31:09
【问题描述】:

我们有一些 C++ 解决方案,我们使用批处理文件运行一些构建脚本,这些文件为解决方案中的每个配置调用 msbuild.exe。

这在 3 台开发机器和一台构建机器上运行良好,但随后其中一个项目在链接时开始挂起。这只发生在最新的四核机器上,我认为是 2.8ghz。它运行在 Windows Server 2003 上,其他运行在 XP 或 Vista 上。

即使我更改了 bat 文件中的构建顺序,这种情况也会持续发生。

如果我从那台机器上的 IDE 运行构建,它不会挂起。

关于什么可能导致这种情况的任何想法?

我正在使用 Visual Studio 2008。


编辑:

我现在看到,当它挂起时,以下内容正在运行:

  • link.exe(2 个实例)一个内存使用量大,一个内存使用量小。
  • vcbuild.exe
  • msbuild.exe
  • vcbuildhelper.exe
  • mspdbsrv.exe

编辑:

exe文件存在,pdb文件也存在。

exe文件被某个进程锁定,我无法删除或移动它。不过我可以删除 pdb 文件。

如果我只使用 VCBuild.exe,我也会遇到问题。

我决定尝试调试 2 个 link.exe 进程和 mspdbsrv.exe 进程。

当我将调试器/MSdev IDE 附加到它们时,我收到一个消息框,指出应用程序已死锁和/或“所有线程已退出”。

我想我必须检查那台机器上安装的 msdev 的服务包。


编辑:

在 debug.htm 输出文件中,在生成 link.exe 命令后,我得到了各种输出。

但是,对于 buildlog.htm 版本,linke.exe 行是最后一行。

这显然是链接器中的一个挂起。绝对是微软的错误。

我现在正试图弄清楚 .rsp(链接器响应)文件是什么。

当我发布时:

link.exe @c:\\Release\RSP00000535202392.rsp /NOLOGO /ERRORREPORT:QUEUE

这是发布构建日志中的最后一行。之后调试的有更多信息。

重新安装不同版本的 Visual Studio 并没有解决问题。

我将向 Microsoft 开一个 issue/ticket。如果可以,我会发布答案。

【问题讨论】:

  • 您是否考虑过附加调试器并查看它似乎挂起的位置?
  • 将调试器附加到所有 CL 和 MSBuild 以及 Link.exe 进程?我不认为这会是一个有趣或富有成效的练习。我将不得不闯入每一个并尝试调试,鉴于这是一个多核 CPU,这将是一场噩梦。除非我错过了什么……
  • 我的错,我以为是挂起的 link.exe。附加到 6 个进程可能不是一个有用的练习。将其视为最后的手段。 :) 也许使用 ProcMon (technet.microsoft.com/en-us/sysinternals/bb896645.aspx) 将有助于缩小导致挂起的确切进程。
  • 我确实尝试过这个,但不确定 asm 代码是否有用 - 调试器给了我关于线程已经退出的奇怪消息...
  • 你是在 VS2008 上带还是不带 SP1?我确实注意到,在升级到 SP1 后,构建过程的多核逻辑发生了变化。

标签: c++ visual-studio msbuild batch-file linker


【解决方案1】:

整个程序优化(/GL 和 /LTCG)和 /MP 不能混合使用——链接器挂起。我在Connect 上提出了这个问题。

结果是,这是 VS2008 中已确认的错误;如果您需要修补程序,请联系 PSS;并且修复包含在 VS2010 中。

如果您不能等待那么久,请关闭 /MP(较慢的编译)或 /LTCG(较慢的代码)。

【讨论】:

  • 谢谢。我会仔细看看的。感谢您的帮助。
  • 这看起来像是一个计时的东西。有些会,有些不会。在一台机器上,有时会,有时不会。使用 CppUnit 编译似乎对我们来说更可靠地触发它。关于构建的一些事情......
【解决方案2】:

您在脚本中使用 xcopy 吗? This 建议使用 cmd /c " .. " 包装 xcopy 作为解决方案。

如果不是这样,我建议通过只让一个 cpu 工作(即删除 /maxcpucount)来缩小范围。这将排除编译进程之间任何形式的竞争条件。

【讨论】:

  • 嗯。我确实有一个提交后步骤,它调用一个 bat 文件,该文件将 *.exe 和 *.pdb 复制到另一个目录......这听起来像是一个很好的罪魁祸首。我会把它拿出来看看结果。
  • 没有修复它。但这为我打开了其他可能性
  • 我在使用 MS Visual Studio 98 时遇到了完全相同的问题,在配置有 2 个 CPU 的虚拟机中运行,移除其中一个 CPU 解决了这个问题
【解决方案3】:

我遇到了类似的问题,但使用的是 Visual Studio 2010。

这是一个在另一台计算机上运行良好的项目,但不是我的新计算机。 描述的症状与最初的 Visual Studio 2008 问题相符。

我能够通过安装 Visual Studio 2010 Service Pack 1 (SP1) 解决此问题

http://www.microsoft.com/download/en/confirmation.aspx?id=23691 - 或者直接去微软搜索“Visual Studio 2010 Service Pack 1”

我运行了我的 Windows“检查更新”并以为我已经安装了所有的服务包,但显然我没有安装任何 Visual Studio 服务包。

安装 VS2010 SP1 后,我不再有这个问题。 我确认我已经在其他较旧的计算机上安装了 VS2010 和 Service Pack 1,而该项目正在运行。

【讨论】:

    【解决方案4】:

    您可以试试这个:通过以下方式打开构建对话框 菜单 -> 工具 -> 选项 -> 项目和解决方案 -> 构建和运行

    您可以在此处将“MSBuild 项目构建输出详细程度”设置为 “诊断”。也许这将提供更多关于什么是 出错了。

    在同一对话框中,您可以设置“并行项目的最大数量 构建”到 1。也许这可以解决 link.exe “挂起”。

    【讨论】:

    • 我已将并行设置为 1,但也会尝试诊断。谢谢
    • 在 MSBuild 的命令行构建中,这对我没有任何作用...除非我遗漏了什么。我会尝试链接器的详细开关。
    • MSBuild 冗长不影响 VC++ 项目;他们使用 VCBuild。
    【解决方案5】:

    mspdbsrv.exe 用于将所有调试信息合并到一个 pdb 文件中。 mspdbsrv.exe 的 VS2005 版本有 bug,可能是 VS2005 版本也有一些相同的问题。在建造之前杀死它对某些人来说会有所不同。我们也将把它添加到我们的构建中,因为我们经常遇到未知的 PDB 错误。

    【讨论】:

      【解决方案6】:

      您是否尝试过禁用增量链接,或者始终强制重建全部?

      【讨论】:

      • 我认为增量链接已关闭,因为它不能与 MP 构建一起使用。我会检查。这个脚本总是先清理然后再构建。
      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 2018-09-02
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多