【发布时间】: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