为什么在构建过程中msbuild和link.exe会“挂起”?

8
我们有几个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命令后会输出各种各样的内容。但是,在release buildlog.htm中,linke.exe行是最后一行。这显然是链接器挂起了。绝对是Microsoft的错误。现在我正在尝试弄清楚.rsp(链接器响应)文件是什么。当我发出以下命令时: link.exe @c:\\Release\RSP00000535202392.rsp /NOLOGO /ERRORREPORT:QUEUE
这是发布版本构建日志中的最后一行。调试版本则在此之后有更多信息。重新安装不同版本的Visual Studio并没有解决问题。我将向Microsoft提交一个问题/工单。如果我能解决它,我会发布答案。

1
你考虑过连接调试器并查看它似乎卡在哪里吗? - Soo Wei Tan
1
将调试器附加到所有CL、MSBuild和Link.exe进程?我认为这不是一项有趣或有效的练习。我必须打断每一个进程并尝试进行调试,考虑到这是一个多核CPU,这将是一场噩梦。除非我漏掉了什么... - Tim
我的错,我以为是 link.exe 卡住了。附加到 6 个进程可能不是什么有用的练习。把它当做最后的手段吧。 :)也许使用 ProcMon(http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)可以帮助缩小导致卡顿的确切进程范围。 - Soo Wei Tan
我尝试过这个,但不确定汇编代码是否有用 - 调试器给了我关于线程已经退出的奇怪消息... - Tim
安装了SP1 - 没有解决问题。 - Tim
显示剩余2条评论
6个回答

8
整个程序优化(/GL和/LTCG)和/MP不兼容--链接器会挂起。我在Connect上提出了这个问题。
结果是这是VS2008中的已确认的错误;如果您想要热修复,请联系PSS;而且该修复程序已包含在VS2010中。
如果您等不及那么长时间,请关闭/MP(编译速度较慢)或/LTCG(代码速度较慢)。

VS2012 screenshot for setting


1
看起来像是一个时间问题。有些会,有些不会。在一台单独的机器上,有时候会出现,有时候不会。使用CppUnit编译似乎更可靠地触发了这个问题。可能与构建过程有关... - Roger Lipscombe

2

您在脚本中使用xcopy吗?这篇文章建议将xcopy与cmd /c " .. "一起使用。

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


嗯。我确实有一个后提交步骤,调用一个批处理文件,该文件将 *.exe 和 *.pdb 复制到另一个目录中……听起来像是罪魁祸首。我会将其删除并查看结果。 - Tim
没有修好。但这为我打开了其他可能性去研究。 - Tim
我在配置了两个CPU的虚拟机中运行MS Visual Studio 98时遇到了完全相同的问题,移除其中一个CPU解决了这个问题。 - willll

2
我遇到了类似的问题,但是是在使用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,并且那个工作项目也正常运行。

1
您可以尝试这样做:通过菜单 -> 工具 -> 选项 -> 项目和解决方案 -> 构建和运行 打开构建对话框。
在这里,您可以将“MSBuild项目生成输出详细程度”设置为“诊断”。也许这会提供更多关于出错原因的信息。
在同一个对话框中,您可以将“最大并行项目生成数”设置为1。也许这可以解决link.exe的“挂起”问题。

我已将并行设置为1,但也会尝试诊断。谢谢。 - Tim
在使用MSBuild进行命令行构建时,这对我没有任何作用...除非我漏掉了什么。我将尝试为链接器使用详细模式开关。 - Tim
MSBuild 的详细程度并不影响 VC++ 项目,它们使用 VCBuild。 - Roger Lipscombe

1

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


0

你尝试过禁用增量链接,或者强制进行全部重建吗?


我认为增量链接被关闭了,因为它无法与MP构建一起使用。我会检查一下。这个脚本总是先清理再构建。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接