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

Ziv*_*Ziv 2 msbuild teamcity cmake visual-studio

我有一个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
Run Code Online (Sandbox Code Playgroud)

构建日志如下所示:

[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
Run Code Online (Sandbox Code Playgroud)

版本信息

我使用的工具是:

  • MSBuild 14.0
  • CMake的3.5.2
  • TeamCity Professional 9.1.7

Ziv*_*Ziv 5

什么是.tlog文件?

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

(来源:Microsoft构建引擎内部:使用MSBuild和Team Foundation Build,作者:Sayed Hashimi和William Bartholomew。)

是什么触发了他们的创造?

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

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

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

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

我了解当前的超时时间(接近15分钟)太长了。

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

我该如何解决?

Bearman建议两种解决方案

  1. 升级Visual Studio。

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

(我尚未尝试升级,因此我无法确认是否可以解决问题。我还感兴趣地注意到,以前一个非常相同的问题的错误报告,该报告在2018年3月得到了答复,即最近的更新已解决了该问题。问题。)

  1. 手动杀死vctip.exe

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

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

taskkill /IM vctip.exe /f >nul 2>&1
Run Code Online (Sandbox Code Playgroud)

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