为什么MSBuild将.tlog文件生成到CMakeFiles / CompilerIdC中,如何使其停止?

时间:2018-06-28 06:37:21

标签: visual-studio cmake msbuild teamcity

我有一个CMake项目,我的一个版本是在TeamCity构建服务器上使用MSBuild在Visual Studio上进行的。

我看到的是运行git clean -f -d -x时经常发生故障(TeamCity在初始化构建时作为资源检出的一部分自行执行的步骤)。失败的原因是因为.tlog文件正在生成到我的CMake构建文件夹中-到CMake的内部CompilerIdC项目中,CMake用来标识本地C编译器。

.tlog的用途是什么,什么触发了它们的创建?我还没有找到文档。

我不明白为什么在CMake运行和构建后它们会出现在 中。我尤其不明白为什么在CompilerIdC的所有源文件和项目文件都被删除后十五分钟内创建它们。

详细信息

文件正在生成到${CMAKE_BUILD_DIR}/CMakeFiles/3.5.2/CompilerIdC/Debug/CompilerIdC.tlog中。它们都是link-VCTIP.(read|write|delete).*.tlog形式。

这是在git clean上失败并在08:41(截至09:30的当前停止)的构建的文件夹状态:

-rw-r--r-- 1 CI 197121  570 Jun 28 08:57 link-VCTIP.delete.1.tlog
-rw-r--r-- 1 CI 197121 1422 Jun 28 08:57 link-VCTIP.delete.26.tlog
-rw-r--r-- 1 CI 197121 7062 Jun 28 08:57 link-VCTIP.read.1.tlog
-rw-r--r-- 1 CI 197121  402 Jun 28 08:50 link-VCTIP.read.103.tlog
-rw-r--r-- 1 CI 197121  402 Jun 28 08:55 link-VCTIP.read.120.tlog
-rw-r--r-- 1 CI 197121  418 Jun 28 08:57 link-VCTIP.read.26.tlog
-rw-r--r-- 1 CI 197121  286 Jun 28 08:57 link-VCTIP.read.27.tlog
-rw-r--r-- 1 CI 197121  286 Jun 28 08:57 link-VCTIP.read.28.tlog
-rw-r--r-- 1 CI 197121  286 Jun 28 08:57 link-VCTIP.read.29.tlog
-rw-r--r-- 1 CI 197121  402 Jun 28 08:45 link-VCTIP.read.87.tlog
-rw-r--r-- 1 CI 197121  600 Jun 28 08:57 link-VCTIP.write.1.tlog
-rw-r--r-- 1 CI 197121  286 Jun 28 08:57 link-VCTIP.write.26.tlog

构建日志如下:

[08:39:58][VCS Root: MyVCS] [D:\TeamCity\buildAgent\work\58a2d5637a76fb3e]: "C:\Program Files\Git\bin\git.exe" clean -f -d -x
[08:41:26][VCS Root: MyVCS] warning: failed to remove build/Windows-x64-Release/: Directory not empty
[08:41:27]
[Updating sources] Failed to perform checkout on agent: '"C:\Program Files\Git\bin\git.exe" clean -f -d -x' command failed.
stdout: Removing Artifacts/x64/
<snip>
Removing build/Windows-x64-Release/CMakeFiles
<snip>
stderr: warning: failed to remove build/Windows-x64-Release/: Directory not empty

版本信息

我正在使用的工具是:

  • MSBuild 14.0
  • CMake 3.5.2
  • TeamCity Professional 9.1.7

2 个答案:

答案 0 :(得分:4)

什么是.tlog文件?

它们是由MSBuild的文件跟踪器输出的,该文件跟踪器包装了Visual C ++构建可执行文件(例如cl.exelink.exe),以跟踪其写入和读取的文件。它将这些文件路径记录在中间目录的.tlog文件中,并依靠它们定义应如何构建增量构建。

(来源:Inside the Microsoft Build Engine: Using MSBuild and Team Foundation Build,Sayed Hashimi和William Bartholomew。)

什么触发了他们的创作?

任何使用MSBuild都可以触发.tlog文件的创建或更新。

为什么这些文件出现得这么晚?

.tlog是写入vctip.exe文件的过程之一。 2018年3月,微软工程师Ian Bearman(VC ++遥测所有者)explained

  

这个小应用程序是一个在构建过程中运行的后台进程,它允许VC ++工具与VS Telemetry Service(也称为VS Experience Improvement Program)进行通信。构建后该应用程序将保持运行,以防立即启动另一个构建以帮助加快编译速度。

     

我知道当前的超时时间(大约15分钟)太长了。

因此,答案是:即使构建结束后(在这种情况下,甚至在所有相关文件都删除之后),后台进程仍保持活动状态,并继续尝试将遥测文件写入其目录。

我该如何解决?

贝尔曼建议two solutions

  1. 升级Visual Studio。
      

    即将发布的Visual Studio版本(从VS 2017 15.7开始,现在处于预览状态)会将其持续运行的时间缩短到上次构建后的15秒。希望这能解决您在继续运行该程序时遇到的任何问题。

(我尚未尝试升级,因此无法确认是否解决了该问题。我还怀着兴趣an earlier bug report注意到了几乎相同的问题,a promise in March 2018回答说最近更新已解决了该问题。)

  1. 手动杀死vctip.exe
  

同时,要解决此问题,请随时随时手动杀死vctip.exe。您可以使用Windows命令taskkill /IM vctip.exe立即将其停止。这样做总是安全的,不必担心数据丢失或损坏。

在我自己的TeamCity案例中,很容易在MSBuild完成后将其作为附加的构建步骤添加到构建配置中-运行脚本:

taskkill /IM vctip.exe /f >nul 2>&1

请注意,此解决方案确实对您的构建系统进行了某些假设,例如它不会一次运行多个版本。并且一定要很好地记录下来,因为稍后弄清楚它的来源将是一件令人头疼的事...

答案 1 :(得分:1)

这里的实际根本原因修复项目可能是:

https://visualstudio.microsoft.com/team-services/support/build-troubleshooting-guidance/

  

MSBuild和/ nodeReuse:false

     

如果在构建过程中调用MSBuild,请确保传递参数/ nodeReuse:false(缩写为/ nr:false)。否则,在构建完成后,MSBuild进程将继续运行。该过程会保留一段时间,以期可能会出现后续构建。

     

由于与MSBuild进程的工作目录存在冲突,MSBuild的此功能可能会干扰尝试删除或移动目录。

     

MSBuild和Visual Studio Build任务已经将/ nr:false添加到传递给MSBuild的参数中。但是,如果您从自己的脚本中调用MSBuild,则需要指定参数。

? (如果实际上是这里的正确处理方法, 比起更精确的治疗 需要随机杀死随机非拥有进程的不确定性变通方法

请注意 如果这是根本原因,那么 这可能也需要在CMake生成器源代码(msbuild invocation [,有条件/智能地])中进行修复...

旁注:我考虑了保持后台进程运行的机制-喘不过气来! -遥测的目的是相当不精确的/不受控制的方式(占用目录等),而这据称是精确控制/执行/确定性的构建过程,相当可疑[/令人反感]。