当两个visual studio进程并行编译时,第二个将重用第一个启动的mspdbsrv
实例。因此,当第一个构建终止并且整个进程树终止时(例如,通过Jenkins),另一个构建失败。
该错误报告描述了如何手动启动它以免被杀死。但事情也因偶尔忘记关闭文件而闻名,这可能会导致 next 构建失败。
是否有mspdbsrv
的选项组合?
好的,我正在寻找通用答案,所以我最初没有包含当前的选项。但到目前为止,答案听起来似乎mspdbsrv
在不使用某些选项时不应使用。除了使用(由CMake)检查MSC ++是否有效的简单测试项目之外,它们没有被使用,但它确实启动mspdbsrv.exe
。普通项目是.vcproj
文件,通过devenv.com CompilerIdC.vcproj /build Debug
编译。构建运行遵循C:
cl.exe /Od /D "_UNICODE" /D "UNICODE" /FD /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W0 /c /TC ".\CMakeCCompilerId.c"
link.exe /OUT:".\CompilerIdC.exe" /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"Debug\CompilerIdC.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /NODEFAULTLIB:"libc" /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ".\Debug\CMakeCCompilerId.obj"
mt.exe /outputresource:".\CompilerIdC.exe;#1" /manifest ".\Debug\CompilerIdC.exe.intermediate.manifest"
以及以下C ++命令:
cl.exe /Od /D "_UNICODE" /D "UNICODE" /FD /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W0 /c /TP ".\CMakeCXXCompilerId.cpp"
link.exe /OUT:".\CompilerIdCXX.exe" /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"Debug\CompilerIdCXX.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /NODEFAULTLIB:"libc" /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ".\Debug\CMakeCXXCompilerId.obj"
mt.exe /outputresource:".\CompilerIdCXX.exe;#1" /manifest ".\Debug\CompilerIdCXX.exe.intermediate.manifest"
这仍然会启动mspdbsrv.exe
。我实际上使用了这样的事实,它暂时保护它免受Jenkins杀手的攻击。</ p>
选项/FD
由devenv.com
注入。我试图通过msbuild
运行它,但它会调用vcbuild
(Visual Studio 2008)并执行相同的命令,包括/FD
选项。而且,只有CMake中的Visual Studio生成器支持WinCE目标,所以我无法轻松切换。
答案 0 :(得分:1)
这不是常见的抱怨,connect.microsoft.com上没有现有的反馈报告。否则,建议的方法是加速解决此类问题,您可以让Microsoft工程师查看此问题。
不,没有特定的选项来禁用 mspdbsrv.exe。只有一个相反,启用它。 /FS option强制编译器使用它。
强烈暗示您使用的是在构建计算机上不常用的编译器选项。你没有记录任何东西所以需要猜测。排名第一的候选人是/MP option。这总是要求编译器使用mspdbsrv.exe,因为它将多次启动编译器,每个编译器都处理一个传递的源文件。需要mspdbsrv.exe的场景,因为每个编译器实例可能都想要写入同一个.pdb文件,特别是/Fd option中指定的程序数据库。
所以看看你的构建脚本并删除/ MP如果你看到它。记下下一步传递给编译器的选项。强烈建议在connect.microsoft.com上提交反馈报告。
更新后:您的构建服务器错误地使用/ FD选项。 MSDN Library文章对此有所说明:
/ FD仅供开发环境使用,不应在命令行或构建脚本中使用。
我无法预测它对mspdbsrv.exe有什么影响,很可能有一个因为/ FS强烈链接到/ Gm强烈链接到/ FD。删除该选项显然是下一步。
答案 1 :(得分:0)
我相信您一定已经尝试过设置“生成调试信息” - &gt;否
不确定下面是否有您的想法: 尝试删除(或重命名或移动到其他位置)mspdbsrv.exe和相关的dll(mspdb80.dll和mspdbcore.dll),然后看看会发生什么。
这只是一个疯狂的猜测但值得尝试。