次の方法で共有


Linux プロジェクトを構成してアドレス サニタイザーを使用する

Visual Studio 2019 バージョン 16.1 の Linux プロジェクトには、AddressSanitizer (ASan) のサポートが統合されています。 ASan は、MSBuild ベースの Linux プロジェクトおよび CMake プロジェクトの両方で有効にできます。 これは、リモートの Linux システムおよび Windows Subsystem for Linux (WSL) で動作します。

ASan とは

ASan とは、C/C++ の次のエラーを検出する、ランタイム メモリ エラー検出機能です。

  • 解放済みへの操作 (付随的なポインターの参照)
  • ヒープのバッファー オーバーフロー
  • スタックのバッファー オーバーフロー
  • 関数外からの操作
  • スコープ外からの操作
  • 初期化順序のバグ

ASan がエラーを検出すると、すぐに実行が停止されます。 デバッガーで ASan が有効になっているプログラムを実行すると、エラーの種類、メモリ アドレス、およびエラーが発生したソース ファイル内の場所を説明するメッセージが表示されます。

アドレス サニタイザーのエラー メッセージを示すスクリーンショット: 解放後のヒープの使用。

ASan の (破損したメモリが割り当てられているまたは割り当て解除されている場所を含む) すべての出力は、出力ウィンドウの [デバッグ] ウィンドウでも確認できます。

MSBuild ベースの Linux プロジェクトで ASan を有効にする

注意

Visual Studio 2019 バージョン 16.4 以降では、Linux プロジェクト用の AddressSanitizer は [プロジェクトのプロパティ]>[構成プロパティ]>[C/C++]>[Address Sanitizer を有効にする] を使って有効にします。

ASan を MSBuild ベースの Linux プロジェクトで有効にするには、そのプロジェクトをソリューション エクスプローラーで右クリックし、 [プロパティ] を選択します。 次に [構成プロパティ]>[C/C++]>[サニタイザー] の順に移動します。 ASan はコンパイラとリンカー フラグから有効にし、プロジェクトを再コンパイルして動作するようにします。

[構成プロパティ] > [C/C++] >[サニタイザー] が選択されているプロジェクトのプロパティ ページのスクリーンショット。[Address Sanitizer を有効にする] が [はい] に設定されています。

オプションの ASan ランタイム フラグを渡すには、 [構成プロパティ]>[デバッグ]>[AddressSanitizer ランタイム フラグ] に移動します。 下向き矢印をクリックし、フラグを追加または削除します。

[構成プロパティ] > [デバッグ] が選択されているプロジェクトのプロパティ ページのスクリーンショット。[AddressSanitizer ランタイム フラグ] は detect_leaks = 0 です。

Visual Studio の CMake プロジェクトで ASan を有効にする

注意

CMake プリセットを使用してビルドするには、まず CMakeLists.txt ファイルで ASan を有効にします。 詳細については、「Windows および Linux で AddressSanitizer を有効にする」を参照してください。

CMake で ASan を有効にするには、ソリューション エクスプローラーCMakeLists.txt ファイルを右クリックし、[プロジェクトの CMake の設定] を選びます。

ダイアログ ボックスの左ウィンドウで、(「Linux-Debug」などの) Linux の構成が選択されていることを確認します。

オプションとして x64-Debug と Linux-Debug が表示されている [構成] ペインのスクリーンショット。

ASan のオプションは [全般] の下にあります。 ASan ランタイム フラグは、スペースで区切った "フラグ=値" の形式で入力します。 UI にはセミコロンを使用する誤った提案が表示されます。 スペースまたはコロンを使用してフラグを区切ってください。

detect_leaks=0 などのいくつかの Address Sanitizer ランタイム フラグが表示されている [Address Sanitizer を有効にする] オプションのスクリーンショット。

ASan のデバッグ シンボルをインストールする

ASan の診断を有効にするには、リモート Linux マシンまたは WSL インストールにそのデバッグ シンボル (libasan-dbg) をインストールする必要があります。 読み込む libasan-dbg のバージョンは、お使いの Linux マシンにインストールされている GCC のバージョンによって異なります。

ASan のバージョン GCC のバージョン
libasan0 gcc-4.8
libasan2 gcc-5
libasan3 gcc-6
libasan4 gcc-7
libasan5 gcc-8

このコマンドを使用すると、どのバージョンの GCC を所有しているか特定できます。

gcc --version

必要な libasan-dbg のバージョンを確認するには、プログラムを実行し、 [出力] ウィンドウの [デバッグ] ウィンドウを確認します。 読み込まれている ASan のバージョンは、お使いの Linux マシンに必要な libasan-dbg のバージョンと対応しています。 Ctrl + F を使用し、ウィンドウで「libasan」を検索します。 たとえば Libasan4 がインストールされている場合、次のような行が表示されます。

Loaded '/usr/lib/x86_64-linux-gnu/libasan.so.4'. Symbols loaded.

次のコマンドを使用すると、Linux ディストリビューションに apt を使用する ASan デバッグ ビットをインストールできます。 このコマンドでは、バージョン 4 がインストールされます。

sudo apt-get install libasan4-dbg

Ubuntu にデバッグ シンボル パッケージをインストールする詳細な手順については、「Debug symbol packages」(デバッグ シンボル パッケージ) を参照してください。

ASan が有効な場合、Visual Studio の [出力] ウィンドウの [デバッグ] ウィンドウの上部で、ASan のデバッグ シンボルをインストールするよう求められます。