AddressSanitizer のクラウドまたは分散テスト

AddressSanitizer エラーが発生したときにその場所でデバッグする必要はありません。 エラーが発生した場合に AddressSanitizer 固有のすべてのコンテキストを格納するクラッシュ ダンプを作成するように、ランタイムを構成します。 その後、そのクラッシュ ダンプを別の PC に送信してデバッグします。 クラウドまたは分散テストで AddressSanitizer を実行するときには、オフライン デバッグによって時間を大幅に節約できます。 障害が発生したテストまたは運用のインフラストラクチャでダンプを作成し、それを後から開発者 PC でデバッグすることができます。

Visual Studio デバッガーは、正確に診断された AddressSanitizer エラーを提供します。 テストを再実行したり、膨大なデータセットをコピーしたり、失われたデータを検出したり、オフラインになったテスト マシンを見つけたりする必要はなく、これらのバグを表示できます。 必要なのは、クラッシュ ダンプを読み込むことだけです。

次の環境変数を設定することで、AddressSanitizer 障害時にクラッシュ ダンプが作成されます。

set ASAN_SAVE_DUMPS=MyFileName.dmp

Note

Visual Studio 名前付け規則に従うために、ファイル名にはサフィックス .dmp が必要です。

このダンプ ファイルは、後から別のマシンで Visual Studio を使用して表示できます。

Visual Studio は、元のソース コードのコンテキストでエラー情報を表示できます。 Visual Studio がこれを行うには、デバッグ シンボルインデックス付きソース コードが必要です。 最適なデバッグ エクスペリエンスを得るには、それらのバイナリを生成するために使用された EXE、PDB、ソース コードが一致している必要があります。

ソースとシンボルの格納の詳細については、「ソースとシンボル」セクションを参照してください。 実装の詳細ときめ細かい制御については、デバッガー統合に関するページを参照してください。

例 - ビルド、テスト、分析

A、B、C の 3 つのマシンを考えます。ビルドはマシン B で行われ、テストはマシン C で実行され、障害はマシン A で分析されます。エラーは、ソース コード内のソース行と列の番号に対して報告されます。 呼び出し履歴と共に、そのソース コードの正確なバージョンを使用して生成された PDB ファイル内のシンボルのセットを表示できます。

.dmp ファイルの作成に至るまでのローカル シナリオまたは分散シナリオと、その AddressSanitizer ダンプ ファイルをオフラインで表示するための手順を次に示します。

ローカルに .dmp を生成する

  • ビルド
  • 実行可能ファイルをテストします
  • 生成された .dmp ファイルをビルド ディレクトリにコピーします
  • .dmp ファイルを同じディレクトリにあるペアの .pdb と共に開きます

分散システムで .dmp を生成する

  • ソース インデックス付けデータ ブロックのために PDB のビルドと後処理を行います
  • (.exe、.pdb) のアトミック ペアをテスト マシンにコピーし、テストを実行します
  • (.pdb、.dmp) のアトミック ペアをバグ報告データベースに書き込みます
  • Visual Studio は、.dmp ファイルを同じディレクトリにあるペアの .pdb と共に開きます

Note

分析に使用する Visual Studio 2019 マシンは、インデックス付きソースが格納されている GitHub または内部 \\Machine\share にアクセスできる必要があります。

AddressSanitizer .dmp ファイルを表示する

  1. デバッガー IDE が PDB ファイルとソース ファイルを検出できることを確認します。

  2. Visual Studio を開き、[コードなしで続行] を選択します。 次に、[ファイル]>[開く]>[ファイル] を選択して、[ファイルを開く] ダイアログを開きます。 ファイル名のサフィックスが .dmp である必要があります。

    Screenshot of the File Open File menu in Visual Studio.

    シンボルとソースへの IDE アクセスを有効にするには、ここに示す画面からもう 1 つの手順が必要です。

  3. シンボル パスを設定し、[Debug with Native Only] (ネイティブのみを使用してデバッグ) を選択します。

    Screenshot of the Minidump Summary display in Visual Studio.

このスクリーンショットは、最終的に読み込まれたダンプ ファイルを示しています。ソースと AddressSanitizer メタデータが読み込まれています。

Screenshot of the debugger showing source files and AddressSanitizer metadata.

ソースとシンボル

クライアントは、ソース サーバーを使用して、アプリケーションのビルドに使用されたソース ファイルの正確なバージョンを取得できます。 実行可能ファイルまたは DLL のソース コードは、時間の経過と共に、またバージョンごとに、変更される可能性があります。 それを使用して、アプリケーションの特定のバージョンをビルドしたのと同じソース コードを確認できます。

PDB ファイルを使用して EXE をデバッグするときに、デバッガーは、埋め込みソース サーバー データ ブロックを使用して、ソース管理から適切なファイルを取得できます。 /Zi コンパイラ オプションによって PDB に自動的に入力された完全修飾名に対応するファイルが読み込まれます。

ソース サーバーを使用するには、pdbstr.exe を使用して srcsrv データ ブロックを PDB ファイルに書き込むことにより、アプリケーションの "ソース インデックス付け" を行う必要があります。 詳細については、ソース サーバーとソース インデックス付けに関するページのデータ ブロックに関するセクションを参照してください。 ソースのインデックス付けとシンボルの発行を行う手順と、デバッガーのシンボルとソース コードを指定する方法も、役に立ちます。

外部ドキュメントについては、以下を参照してください。

関連項目

AddressSanitizer の概要
AddressSanitizer の既知の問題
AddressSanitizer のビルドと言語リファレンス
AddressSanitizer ランタイム リファレンス
AddressSanitizer シャドウ バイト
AddressSanitizer デバッガーの統合
AddressSanitizer エラーの例