先日のRedditにユーザ名“sammiesdog”氏が,Visual StudioのC++コンパイラが自動的にMicrosoftのテレメトリサービスの関数コールを追加している,と主張する記事を投稿した。記事に添付されたスクリーンショットからは,単純な5行のCPPファイルから,“telemetry_main_invoke_trigger
”という関数コールを含んだアセンブリ言語ファイルが生成される様子が見て取れる。
議論はその後,この未発表の”機能”を無効にするにはどうすればよいか,目的は何なのか,といった話題へと展開した。“sammiesdog”氏の報告はリリースビルドについてだが,その後”ssylvan”氏が,デバッグビルドでも同じであることを示している。テレメトリ機能の目的はETWとの通信だ。
“xon-xoff”氏は関連スレッドの中で,懸念点について記している。
そのとおり,ETWそのものは単なるログイベントです。それ自体は問題ありません。問題なのは次の点です。
- ETWはリモートテレメトリのソリューションの一部として機能し,しばしばその目的で使用される。
- これらのイベントは,CRTがプログラムに静的リンクされている場合,そのプログラム自体が発行する。
- それがテレメトリというものだ。
本記事のための調査中に筆者は,以下のCPPコードをVisual Studio 2015 Update 2でコンパイルした時に,“sammiesdog”氏の報告したテレメトリ関数コールを確認することができた。
#include "stdafx.h"
#include <iostream>
int main()
{
return 0;
}
telemetry_main_invoke_trigger
コールは,このプロジェクトをWindows 7とWindows 10でコンパイルした時の,DebugとReleaseのいずれのビルドでも確認されている。
この関数の発見に関する論争や対話は,その後,MicrosoftでVisual C++チームの開発マネージャを務めるSteve Carroll氏による説明を引き出した。氏の返答の中で何よりも重要なのは,この機能がVisual Studio 2015のUpdate 3で削除されると明言されたことだ。Carrol氏はさらに,この機能を追加したMicrosoftの思考プロセスについての説明を続ける。
... このコードがオンになっていた場合に行なうのは,タイムスタンプとモジュールロードイベントを示すETWイベントのトリガです。イベントデータが解釈可能なのは,ユーザがシンボル情報を(PDBなどで)提供する場合に限られます。つまりこのデータは,ユーザが私たちに積極的に支援を求めて,調査の一環としてPDBを提供することで初めて,その意味を持つのです。現在に至るまで私たちが,実際のユーザを対象にこれらすべてを行なったことはありません。今のところはすでに確立したアプローチで,潜在的な問題の調査と対処を行なう方法で事が足りています。
VS205 Update 2のコピーを所持していて,なおかつ現時点でコンパイルしたコードのテレメトリ機能をオフにしたい場合は,リンカのコマンドラインに“notelemetry.obj
”を指定する必要がある。(このフィックスはCarrol氏が確認済み。)
このデフォルト動作について,Visual Studio “15”でも含まれているのかをMicrosoftに問い合わせてみたところ,同社の広報担当によると,動作自体は“15”にも存在するが,今後のプレビューリリースでは廃止される予定だという。ただし廃止のタイムテーブルは提供されていない。また,VS2012とVS2013はこのテレメトリ機能の対象外である。
この記事を評価
- 編集者評
- 編集長対応