【问题标题】:Avoid mspdbsrv when compiling in Visual Studio (2008)在 Visual Studio (2008) 中编译时避免使用 mspdbsrv
【发布时间】:2014-04-10 13:01:28
【问题描述】:

当两个 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 杀手的影响。

/FD 选项由devenv.com 注入。我尝试通过msbuild 运行它,但它调用vcbuild (Visual Studio 2008) 并执行相同的命令,包括/FD 选项。而且 WinCE 目标只有 CMake 中的 Visual Studio 生成器支持,所以我无法轻松切换到 make。

【问题讨论】:

  • 它无法回答您的问题,但您可以通过类似mspdbsrv.exe -stop 的命令行调用自行关闭它。您还可以使用-verbose 命令行参数从中收集更多信息(再加上-start 参数或任何其他参数)

标签: windows visual-studio-2010 visual-studio-2012 visual-studio-2008


【解决方案1】:

这不是常见的投诉,connect.microsoft.com 上没有针对它的现有反馈报告。否则,加速解决此类问题的推荐方法是让 Microsoft 工程师来查看问题。

不,没有特定的选项可以禁用 mspdbsrv.exe。只有一个相反的,启用它。 /FS option 强制编译器使用它。

强烈提示您正在使用构建机器上不常用的编译器选项。您没有记录任何内容,因此需要猜测。排名第一的候选人是/MP option。这总是要求编译器使用 mspdbsrv.exe,因为它将多次启动编译器,每次都处理传递的源文件之一。需要 mspdbsrv.exe 的场景,因为每个编译器实例都可能想要写入同一个 .pdb 文件,尤其是在 /Fd option 中指定的程序数据库。

因此,请查看您的构建脚本并在看到 /MP 时将其删除。记录您接下来传递给编译器的选项。强烈建议在 connect.microsoft.com 上提交反馈报告。


更新后:您的构建服务器错误地使用了 /FD 选项。 MSDN 库文章对此有这样的说法:

/FD 仅供开发环境使用,不应在命令行或构建脚本中使用。

我无法预测它对 mspdbsrv.exe 有什么影响,它很可能有影响,因为 /FS 与 /Gm 密切相关,而 /Gm 又与 /FD 密切相关。删除该选项显然是下一步。

【讨论】:

  • Visual Studio 绝对不是不常见的编译器。但是我们仍然需要它的一些旧版本(Visual Studio 2008;较新的版本不支持 WinCE,它们仍然用于自定义设备),我不希望 Microsoft 修复任何东西。它不像它经常失败。但偶尔会这样,然后需要人工干预,所以我想知道是否存在不会使用它的已知案例。
  • 这很清楚,奇怪的是你没有改进你的问题。您肯定知道构建日志中使用了哪些编译选项?
  • 我知道使用了哪些选项(在编译选项对话框中查看更容易)。但这不会告诉我是否存在阻止使用 mspdbsrv 的组合。
  • 叹息,主要断开连接。你为什么不让我们告诉你这个?该站点不是 youtube.com,如果您不发布这些选项,我们将看不到这些选项。不要发布选项对话框的屏幕截图,我们需要知道正在使用的确切命令行。一个就够了。
  • 我有一个类似的问题,在 CI 中完成的一个构建导致另一个构建被间接杀死,所以我也希望禁用这个东西。我的命令行没有 /FD 虽然: cl /Fd..\..\..\build\bin\x86\vc.pdb /I "..\..\..\..\util\ build\include" /I "C:\DevEnv\Tools\Visual C++\VC\atlmfc\include" /DUNICODE /D_UNICODE /DWIN32 /GS /EHac /c​​ /nologo /W3 /Zi /MT /Fo..\.. \..\build\obj\x86\FileDialogEventHandler.obj FileDialogEventHandler.cpp
【解决方案2】:

我相信你一定已经尝试过设置“生成调试信息” -> 否

不确定您是否想到以下内容: 尝试删除(或重命名或移动到其他位置)mspdbsrv.exe 和相关 dll(mspdb80.dll 和 mspdbcore.dll),然后看看会发生什么。

这只是一个疯狂的猜测,但值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多