最近,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