最近,Reddit 用户“sammiesdog”回复称 Visual Studio 的编译器会自动添加调用 Microsoft 遥测服务的函数。评论所附屏幕截图显示了一个非常简单的 5 行的 CPP 文件自动产生的汇编语言文件中, 包含了一个叫“telemetry_main_invoke_trigger”的函数。
接下来的讨论围绕着如何禁用这个突如其来的“功能”,同时用户们揣测了这个功能的用意。用户“sammiesdog”注意到该功能出现在发布模式中,而用户“ssylvan”指出它还会出现在调试模式中。遥测函数好像是与 ETW 通信。
用户“xon-xoff”在回复中表达了他们对于相关线程的担忧:
你是正确的,ETW 本身仅记录事件。这本身不是一个问题,但是问题出在这些环节:
- ETW 有时可以作为遥测的解决方案的一部分。
- 当 CRT 静态连接到程序时,这些事件来自于程序本身。
- 它被称为遥测。
在为本文进行研究的过程中,作者可以看到用户“sammiesdog”使用以下 CPP 代码,由 Visual Studio 2015 Update 2 编译时所报告的遥测功能调用。
#include "stdafx.h" #include <iostream> int main() { return 0; } </iostream>
当项目在 Windows 7 和 Windows 10 操作系统下编译的时候,可以在调试和发布模式发现 telemetry_main_invoke_trigger。
在这个功能发现之后引发了异常热烈的争论和讨论,Microsoft Visual C++ 团队的开发经理 Steve Carroll 对此发表了回应。他在声明中明确表示这个功能将会在 Visual Studio 2015’s Update 3 中被移除。Carroll 接着讨论了 Microsoft 有关于这个功能的一些想法:
…代码的功能是触发 ETW 事件,当它被触发时,将会发出时间戳和模块加载事件。事件的数据仅仅代表着一个用户给我们提供了符号信息(比如说 PDBs),这些数据仅适用于积极寻求我们帮助,并愿意将 PDBs 作为调查数据的一部分与我们分享的用户。我们从没有真正地用过这个办法,到目前为止我们都依赖于现有的方法来调查并解决潜在的问题。
同时,有拷贝 VS2015 Update 2 并希望关闭目前被编译到代码中的遥测功能的用户必须添加“notelemetry.obj”到其链接器命令行中。(这个修复方法得到了 Carroll 的确认)。
InfoQ 向 Microsoft 确认了这个默认行为是否出现在 Visual Studio “15”中,根据一位 Microsoft 发言人表示,这个行为现在确实存在在“15”中,在将来的预览版中将会被删除。然而,确切的移除时间表还没有确认。VS2012 和 VS2013 不包括这种遥测行为。
查看英文原文: Reviewing Microsoft’s Automatic Insertion of Telemetry into C++ Binaries
感谢夏雪对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论