最近,Reddit用户“sammiesdog” 回复 称Visual Studio的编译器会自动添加调用Microsoft遥测服务的函数。评论所附 屏幕截图 显示了一个非常简单的5行的CPP文件自动产生的汇编语言文件中,包含了一个叫“telemetry_main_invoke_trigger”的函数。
接下来的讨论围绕着如何禁用这个突如其来的“功能”,同时用户们揣测了这个功能的用意。用户“sammiesdog”注意到该功能出现在发布模式中,而用户“ssylvan”指出它还会出现在调试模式中。遥测函数好像是与ETW通信。
用户“xon-xoff”在 回复 中表达了他们对于相关线程的担忧:
你是正确的,ETW本身仅记录事件。这本身不是一个问题,但是问题出在这些环节:
在为本文进行研究的过程中,作者可以看到用户“sammiesdog”使用以下CPP代码,由Visual Studio 2015 Update 2编译时所报告的遥测功能调用。
#include "stdafx.h" #include int main() { return 0; }
当项目在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 )关注我们。