评估Microsoft自动插入遥测函数到C++二进制程序中

最近,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 
   
     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中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。

你可能感兴趣的:(评估Microsoft自动插入遥测函数到C++二进制程序中)