Visual Studio の IntelliTrace のステップ バックを使用して以前のアプリケーション状態を調べる (Visual Studio Enterprise)
IntelliTrace のステップ バックでは、ブレークポイントとデバッガー ステップ イベントごとにアプリケーションのスナップショットを自動作成します。 記録されたスナップショットにより、前のブレークポイントまたはステップに戻り、過去の時点でのアプリケーションの状態を確認できるようになります。 IntelliTrace ステップ バックでは、以前のアプリケーションの状態を確認したいが、デバッグの再開や必要なアプリ状態の再作成は必要でない場合に時間を節約できます。
IntelliTrace のステップ バックは、Visual Studio Enterprise 2017 バージョン 15.5 以降から使用できます。これでは Windows 11 または Windows 10 Anniversary Update 以前が必要です。 現在、この機能は ASP.NET、WinForms、WPF、マネージド コンソール アプリ、マネージド クラス ライブラリのデバッグでサポートされています。 この機能は、Visual Studio 2017 Enterprise バージョン 15.7 以降では、ASP.NET Core と .NET Core でもサポートされています。 この機能は、Visual Studio 2017 Enterprise バージョン 15.9 プレビュー 2 では、Windows のネイティブ アプリでもサポートされています。 UWP アプリケーションのデバッグは現在サポートされていません。
このチュートリアルでは、次のことについて説明します。
- IntelliTrace イベントとスナップショットの有効化
- ステップ バックおよび次へ進むコマンドを使用したイベント間の移動
- イベントのスナップショットの参照
IntelliTrace イベントとスナップショット モードの有効化
Visual Studio Enterprise でプロジェクトを開きます。
[ツール]>[オプション]>[IntelliTrace] 設定を開き、 [IntelliTrace events and snapshots](IntelliTrace のイベントとスナップショット) のオプションを選択します。
Visual Studio 2017 Enterprise バージョン 15.9 プレビュー 2 以降では、このオプションは [IntelliTrace snapshots (managed and native)](IntelliTrace スナップショット (マネージドおよびネイティブ)) になっています。
例外のスナップショットを表示するオプションを構成する場合、 [オプション] ダイアログ ボックスの [IntelliTrace]>[詳細] の順に選択します。
これらのオプションは、Visual Studio 2017 Enterprise バージョン 15.7 以降にあります。
イベントとスナップショットを有効にすると、例外でもスナップショットの作成が既定で有効になります。 [Collect snapshots on exception events](例外イベントでスナップショットを収集する) をオフにすると、例外でのスナップショットを無効にできます。 この機能を有効にすると、未処理の例外でスナップショットが作成されます。 処理済みの例外の場合、スローされた例外が既にスローされている例外の再スローでない場合のみ、スナップショットが作成されます。 ドロップダウン リストから値を選択すると、例外時のスナップショットの最大数を設定することができます。 これは、(アプリがブレークポイントにヒットしたときなど) アプリがブレーク モードに入るたびの最大数です。
Note
スナップショットは、IntelliTrace が記録する例外イベントのみに作成されます。 マネージド コードで IntelliTrace が記録するイベントを指定するには、 [ツール]>[オプション]>[IntelliTrace イベント] の順に選択します。
プロジェクトで、1 つ以上ブレークポイントを設定し、デバッグを開始 (F5 キーを押します) するか、コードをステップ実行してデバッグを開始します (F10 または F11)。
IntelliTrace は、アプリケーションの手順のデバッガーのステップ実行、ブレークポイント イベント、未処理の例外イベントごとにスナップショットを作成します。 これらのイベントは、[診断ツール] ウィンドウの [イベント] タブに、その他の IntelliTrace のイベントと共に記録されます。 ウィンドウを開くには、 [デバッグ]>[Windows]>[診断ツールの表示] の順に選択します。
スナップショットがあるイベントの横にはカメラ アイコンが表示されます。
パフォーマンス上の理由から、迅速にステップ実行された場合、スナップショットは作成されません。 ステップの横にカメラ アイコンが表示されない場合は、ステップ実行をもっとゆっくり実行してみてください。
スナップショット間の移動と参照
イベント間を移動するには、デバッグ ツールバーの [前に戻る] (Alt + [) ボタンと [次へ進む] (Alt + ]) ボタンを使用します。
これらのボタンを使用すると、 [診断ツール] ウィンドウの [イベント] タブに表示されるイベント間を移動できます。 あるイベントに戻るまたは進むと、選択したイベントのデバッグ履歴が自動的に有効になります。
前に戻ったり、次へ進んだりすると、Visual Studio はデバッグ履歴モードになります。 このモードでは、選択しているイベントが記録されたときにデバッガーのコンテキストが切り替わります。 ポインターも、Visual Studio によりソース ウィンドウの対応するコード行に移動します。
このビューでは、値を [呼び出し履歴]、[ローカル]、[自動変数] および [Watch] ウィンドウで確認できます。 また、変数の上にマウスを置き、[データヒント] を表示して、式の評価を [イミディエイト] ウィンドウで実行できます。 表示されるデータは、アプリケーションのプロセスの時点で作成されたスナップショットからのものです。
そのため、たとえばブレークポイントにヒットし、ステップを実行した場合 (F10)、[前に戻る] ボタンにより Visual Studio は、ブレークポイントに対応するコード行で履歴モードになります。
ライブ実行に戻るには、[続行] (F5) を選択するか、情報バーの [ライブ デバッグに戻る] リンクを選択します。
スナップショットは、[イベント] タブで確認することも可能です。スナップショットがあるイベントを選択し、[デバッグ履歴の有効化] を選択します。
[次のステートメントの設定] コマンドとは異なり、スナップショットを表示してもコードは再実行されません。過去にそれが起こった時点のアプリケーション状態の静的なビューが表示されます。
Visual Studio で変数を確認する方法の詳細については、デバッガーでのはじめにに関するページを参照してください。
よく寄せられる質問
IntelliTrace のステップ バックは IntelliTrace のイベント限定モードとどのように違いますか?
IntelliTrace のイベント限定モードでは、デバッガーのステップ実行とブレークポイントでデバッグ履歴を有効にできます。 ただし、IntelliTrace はウィンドウが開いている場合の [ローカル] および [自動変数] ウィンドウのデータしかキャプチャしません。そしてキャプチャされるのは、展開されて表示されているもののみです。 イベント限定モードでは、多くの場合、変数の完全なビューと複合オブジェクトがありません。 また、[ウォッチ] ウィンドウでの式の評価とデータの参照はサポートされていません。
イベントおよびスナップショット モードでは、IntelliTrace は複合オブジェクトを含むアプリケーションのプロセスのスナップショット全体をキャプチャします。 コード行では、ブレークポイントで停止したのと同じ状態で同じ情報が表示されます (これは以前情報を開いたかどうかには関係しません)。 スナップショットを参照するとき、式の評価もサポートされます。
この機能はパフォーマンスにどのような影響を与えますか?
ステップ実行がパフォーマンス全体に与える影響は、アプリケーションによって異なります。 スナップショットの作成にかかるオーバーヘッドは、約 30 ミリ秒です。 スナップショットが作成されると、アプリのプロセスがフォークされ、フォークされたコピーが中断されます。 スナップショットを参照するとき、Visual Studio はプロセスのフォークされたコピーにアタッチされています。 Visual Studio は各スナップショットで、ページ テーブルのみをコピーし、ページをコピー オン ライトとして設定します。 関連付けられているスナップショットがあるデバッガーのステップ間でヒープのオブジェクトが変わる場合、該当するページ テーブルがコピーされるので、メモリのコストはわずかになります。 Visual Studio がスナップショットを作成するのに十分なメモリがないと判断した場合、作成されません。
既知の問題
Windows 10 Fall Creators Update (RS3) より後のバージョンの Windows で IntelliTrace のイベントとスナップショット モードを使用しており、アプリケーションのデバッグ プラットフォーム ターゲットが x86 に設定されている場合、IntelliTrace ではスナップショットを作成しません。
回避策:
- Windows 10 Anniversary Update (RS1) を使用しているとき、お使いのバージョンが 10.0.14393.2273 以前の場合、KB4103720 をインストールします。
- Windows 10 Creators Update (RS2) を使用しているとき、お使いのバージョンが 10.0.15063.1112 以前の場合、KB4103722 をインストールします。
- Windows 11 または Windows 10 Fall Creators Update (RS3) をインストールするか、これにアップグレードします。
- または、次のようにします。
Visual Studio インストーラーからデスクトップ (x86、x64) コンポーネント用の VC++ 2015.3 v140 ツールセットをインストールします。
対象アプリケーションをビルドします。
コマンド ラインで
editbin
ルを使って、ターゲット実行可能ファイルのLargeaddressaware
グを設定します。 たとえば、(パスのアップデート後) "C:\Program Files (x86)\Microsoft Visual Studio\Preview\Enterprise\VC\Tools\MSVC\14.12.25718\bin\Hostx86\x86\editbin.exe" /Largeaddressaware "C:\Path\To\Application\app.exe" のコマンドを使用します。デバッグを開始するには、F5 キーを押します。 これで、デバッガーのステップ実行とブレークポイントでスナップショットが作成されるようになります。
注意
Largeaddressaware
フラグは、実行可能ファイルが変更され再構築されるたびに設定する必要があります。
アプリケーションのプロセスのスナップショットが永続化メモリにマップされたファイルを使用するアプリケーションで作成された場合、(親プロセスでロックがリリースされた場合も) そのスナップショットのプロセスがメモリでマップされたファイルの排他的ロックを保持します。 その他のプロセスは、依然メモリにマップ済みのファイルを読み取ることはできますが、書き込むことはできません。
対応策 :
- デバッグ セッションを終了して、すべてのスナップショットをクリアします。
多数の DLL を読み込むアプリケーションなど、そのプロセスに一意のメモリ領域が多数あるアプリケーションをデバッグする場合、スナップショットが有効なステップ実行のパフォーマンスに影響がある場合があります。 この問題は、Windows の今後のバージョンで対処される予定です。 この問題が発生している場合は、stepback@microsoft.com までご連絡ください。
イベントおよびスナップショット モードで [デバッグ] > [IntelliTrace] > [IntelliTrace セッションを保存する] でファイルを保存する場合、スナップショットからキャプチャしたその他のデータは .itrace ファイルにはありません。 ブレークポイントやステップ イベントでは、IntelliTrace イベントのみモードでファイルを保存したのと同じ情報が表示されます。
次のステップ
このチュートリアルでは、IntelliTrace でステップ バックの使用方法を学習しました。 他の IntelliTrace の機能の詳細については、以下を参照してください。