次の方法で共有


Visual Studio でのデバッグ セッションのナビゲート (XAML および C#)

このクイック スタートでは、Visual Studio デバッグ セッション間を移動する方法と、セッションでプログラムの状態を表示および変更する方法を示します。

Visual Studio でのデバッグに慣れていない開発者や、Visual Studio でのデバッグ セッション間の移動について詳しく学習したい開発者向けです。 デバッグ自体の手法については説明しません。 サンプル コードのメソッドは、このトピックで説明するデバッグ手順を示すためだけに設計されています。 メソッドは、アプリの設計や関数の設計のベスト プラクティスを採用していません。 すぐにわかるように、メソッドもアプリ自体もほとんど何もしません。

このクイック スタートの各セクションは、できるだけ独立した設計にしたので、既に精通している情報が含まれているセクションはスキップできます。 サンプル アプリを作成する必要もありませんが、できるだけ簡単な手順にしてあるので、作成することをお勧めします。

デバッガーのキーボード ショートカット。 Visual Studio デバッガーのナビゲーションは、マウスとキーボードの両方に対して最適化されています。 このトピックの手順の多くでは、キーボード アクセス キーまたはショートカット キーが、かっこで囲まれて示されています。 たとえば、(キーボード: F5) は、F5 キーを押すとデバッガーの実行が開始または継続されることを示しています。

このトピックの内容

以下の方法について説明します。

  • サンプル アプリを作成する

  • ブレークポイントを設定してそこまで実行し、メソッドにステップ インしてプログラム データを調べる

  • メソッドのステップ イン、ステップ オーバー、およびステップ アウトを行う

  • 条件付きブレークポイントを設定し、カーソル位置まで実行して、変数を視覚化する

  • エディット コンティニュと、例外からの回復を行う

サンプル アプリを作成する

デバッグの対象はコードなので、サンプル アプリではソース ファイルを作成するためだけに Windows Store アプリのフレームワークを使用します。ソース ファイルでは、デバッグ セッション間の移動のしくみや、プログラムの状態を調べたり変更したりする方法を確認できます。 呼び出すすべてのコードはメイン ページのコンストラクターから呼び出されます。コントロールの追加やイベントの処理は行いません。

既定の C# Windows ストア アプリを作成します。 Visual Studio を開きます。 ホーム ページで、[新しいプロジェクト] リンクを選択します。 [新しいプロジェクト] ダイアログ ボックスの [インストール済み] の一覧で [Visual C#] を選択し、[Windows ストア] を選択します。 プロジェクト テンプレートの一覧で [アプリケーション] をクリックします。 新しいソリューションとプロジェクトが作成され、MainPage.xaml デザイナーと XAML コード エディターが表示されます。

MainPage.xaml.cs ソース ファイルを開きます。 XAML エディター内を右クリックして、[コードの表示] をクリックします。 MainPage.xaml.cs の分離コード ファイルが表示されます。 ファイルには、MainPage() コンストラクターというメソッドだけがあることに注意してください。

MainPage コンストラクターをサンプル コードに置き換えます。 MainPage() メソッドを削除します。 「デバッガーのナビゲーションのサンプル コード (Xaml および C#)」を参照して、C# セクションに示されているコードをクリップボードにコピーします。 (このクイック スタート ページに戻るには、ブラウザーまたはヘルプ ビューアーで [戻る] をクリックします。) Visual Studio エディターで、partial class MainPage ブロック内にコードを貼り付けます。 Ctrl キーを押しながら S キーを押して、ファイルを保存します。

これで、このトピックの例を実際に行うことができるようになりました。

ブレークポイントを設定してそこまで実行し、メソッドにステップ インしてプログラム データを調べる

デバッグ セッションを開始するための最も一般的な方法は、[デバッグ] メニューで [デバッグの開始] をクリックすることです (キーボード: F5)。 実行が開始され、ブレークポイントに達するか、手動で実行が中断されるか、例外が発生するか、アプリが終了するまで続行されます。

デバッガーで実行が中断されているときは、変数の上にマウスを置くことによって、アクティブな変数の値をデータ ヒントで確認できます。 また、[ローカル] ウィンドウおよび [自動変数] ウィンドウを開いて、アクティブな変数とその現在の値を一覧表示することもできます。 ウォッチ ウィンドウに変数を追加すると、アプリの実行が続けられている間も変数の値に注目できます。

アプリケーションの実行を中断した後 (デバッガーへの割り込みともいいます)、それ以降のプログラム コードの実行方法を制御します。 1 行ずつ実行したり、メソッド呼び出しからメソッド自体に移動したり、呼び出されているメソッドをシングル ステップで実行したりできます。 これらの手順は、アプリのステップ実行と呼ばれます。 また、アプリの普通の実行を再開したり、設定してある次のブレークポイントまで実行したり、カーソルを置いた行まで実行したりすることもできます。 デバッグ セッションはいつでも停止できます。 デバッガーは、必要なクリーンアップ操作を行って実行を終了するように設計されています。

例 1

この例では、MainPage.xaml.cs ファイルの MainPage コンストラクターにブレークポイントを設定し、最初のメソッドにステップ インして、変数の値を確認してからデバッグを停止します。

ブレークポイントを設定します。 MainPage コンストラクターのステートメント methodTrack = "Main Page"; にブレークポイントを設定します。 ソース コード エディターの網掛けされた余白で行を選択します (キーボード: 行にカーソルを置き、F9 キーを押します)。

Step into

ブレークポイント アイコンが余白に表示されます。

ブレークポイントまで実行します。 [デバッグ] メニューの [デバッグの開始] をクリックして、デバッグ セッションを開始します (キーボード: F5 キー)。

アプリの実行が開始され、ブレークポイントを設定したステートメントの直前で実行が中断します。 余白の現在行アイコンによって場所が示され、現在のステートメントが強調表示されます。

Set a breakpoint

アプリの実行を制御できるようになり、プログラムのステートメントをステップ実行しながらプログラムの状態を確認できます。

メソッドにステップ インします。 [デバッグ] メニューの [ステップ イン] をクリックします (キーボード: F11)。

Current line

デバッガーが次の行である Example1 メソッドの呼び出しに移動します。 [ステップ イン] を再びクリックします。 デバッガーが Example1 メソッドのエントリ ポイントに移動します。 これは、メソッドが呼び出し履歴に読み込まれ、ローカル変数のメモリが割り当てられたことを示します。

コード行にステップ インするとき、デバッガーは次の操作のいずれかを実行します。

  • 次のステートメントがソリューション内の関数の呼び出しではない場合、デバッガーはステートメントを実行し、次のステートメントに移動して、実行を中断します。

  • ステートメントがソリューション内の関数の呼び出しの場合、デバッガーは呼び出された関数のエントリ ポイントに移動して、実行を中断します。

終了ポイントに到達するまで、Example1 のステートメントのステップ インを続けます。 メソッドの終了の中かっこが強調表示されます。

データ ヒントで変数の値を確認します。 変数名の上にマウス ポインターを置くと、変数の名前、値、および型がデータ ヒントに表示されます。

Debugger data tip

変数 a の上にマウス ポインターを置きます。 名前、値、およびデータ型を確認します。 変数 methodTrack の上にマウス ポインターを置きます。 再度、名前、値、データ型を確認します。

ローカル ウィンドウで変数の値を確認します。 [デバッグ] メニューの [ウィンドウ] をポイントし、[ローカル] をクリックします (キーボード: Alt + 4)。

Locals window

[ローカル] ウィンドウは、関数のパラメーターと変数のツリー ビューです。 オブジェクト変数のプロパティは、オブジェクト自体の子ノードです。 this 変数は、すべてのオブジェクト メソッドの非表示パラメーターで、オブジェクト自体を表します。 この場合は、MainPage クラスを表します。 methodTrack は MainPage クラスのメンバーであるため、その値とデータ型は this の下の行に表示されます。 methodTrack の情報を表示するには this ノードを展開します。

MethodTrack 変数のウォッチを追加します。 methodWatch 変数は、このクイック スタート全体で、例において呼び出されたメソッドを示すために使用されています。 変数の値を見やすくするため、ウォッチ ウィンドウに追加します。 [ローカル] ウィンドウで変数名を右クリックし、[ウォッチ式の追加] をクリックします。

Watch window

[ウォッチ] ウィンドウでは複数の変数を確認できます。 [ローカル] ウィンドウやデータ ヒント ウィンドウの値など、ウォッチ対象の変数の値は、実行が中断されるたびに更新されます。 また、コード エディターから、[ウォッチ] ウィンドウに変数を追加することもできます。 ウォッチする変数を選択し、右クリックして、[ウォッチ式の追加] をクリックします。

メソッドのステップ イン、ステップ オーバー、およびステップ アウト

親メソッドによって呼び出されるメソッドへのステップ インに対し、メソッドのステップ オーバーでは、子メソッドが実行された後、親が再開すると、呼び出し側のメソッドで実行が中断されます。 メソッドの動作がよくわかっていて、その実行が調査中の問題に影響を与えないことが明らかな場合などは、メソッドをステップ オーバーします。

メソッドの呼び出しを含まないコード行をステップ オーバーすると、行へのステップ インと同じように行が実行されます。

子メソッドをステップ アウトすると、子メソッドの実行が続けられ、子メソッドから呼び出し側メソッドに戻った後で、実行が中断されます。 長い関数で残りの部分は重要ではないと判断した場合など、ステップ アウトを使用できます。

関数のステップ オーバーでもステップ アウトでも、関数は実行されます。

Step into, over, and out of methods

例 2

この例では、メソッドのステップ イン、ステップ オーバー、およびステップ アウトを行います。

MainPage コンストラクターで Example2 メソッドを呼び出します。 MainPage コンストラクターを編集し、methodTrack = String.Empty; の後の行を Example2(); に置き換えます。

Call Example2 method from the Demo method

ブレークポイントまで実行します。 [デバッグ] メニューの [デバッグの開始] をクリックして、デバッグ セッションを開始します (キーボード: F5 キー)。 デバッガーの実行がブレークポイントで中断します。

コード行をステップ オーバーします。 [デバッグ] メニューの [ステップ オーバー] をクリックします (キーボード: F10)。 デバッガーは、ステートメントのステップ インと同じ方法で、methodTrack = "MainPage"; ステートメントを実行します。

Example2 および Example2_A にステップ インします。 F11 キーを押して Example 2 メソッドにステップインします。 int x = Example2_A(); 行に到達するまで Example2 のステートメントのステップ インを続けます。 再びこの行にステップ インして、Example2_A のエントリ ポイントに移動します。 Example2 に戻るまで Example2_A の各ステートメントのステップ インを続けます。

Example2

関数をステップ オーバーします。 Example2 の次の行 int y = Example2_A(); は基本的に前の行と同じであることに注意してください。 この行は安全にステップ オーバーできます。 F10 キーを押して、Example2 の再開から Example2_A のこの 2 回目の呼び出しまで移動します。 F10 キーを押してこのメソッドをステップ オーバーします。 methodTrack 文字列で Example2_A メソッドが 2 回実行されたことが示されている点に注意してください。 デバッガーがすぐに次の行に移動することもわかります。 Example2 の再開ポイントでは実行は中断されません。

関数をステップ アウトします。 F11 キーを押して Example2_B メソッドにステップ インします。 Example2_B が Example2_A と大差ないことに注意してください。 メソッドをステップ アウトするには、[デバッグ] メニューの [ステップ アウト] をクリックします (キーボード: Shift + F11)。 methodTrack 変数で、Example2_B が実行されたこと、およびデバッガーが Example2 の再開ポイントに戻ったことが示されていることに注意してください。

デバッグを停止します。 [デバッグ] メニューの [デバッグの停止] をクリックします (キーボード: Shift + F5)。 これによりデバッグ セッションが終了します。

条件付きブレークポイントを設定し、カーソル位置まで実行して、変数を視覚化する

条件付きブレークポイントでは、デバッガーが実行を中断する条件を指定します。 条件は、true または false として評価できる任意のコード式によって指定します。 たとえば、条件付きブレークポイントを使用すると、変数が特定の値に到達した場合にのみ、頻繁に呼び出されるメソッドでのプログラムの状態を確認できます。

カーソルまでの実行は、一度だけのブレークポイントを設定することと同じです。 実行が中断されたら、ソースで行を選択し、選択した行に到達するまで実行を再開できます。 たとえば、メソッド内のループをステップ実行していて、ループのコードが正しく実行されていることがわかったとします。 そのような場合、ループのすべての反復をステップ実行する代わりに、ループの実行が終了した後に配置したカーソルまで実行できます。

データ ヒントや変数ウィンドウの行で変数の値を表示することが困難な場合があります。 デバッガーでは、スクロール可能なウィンドウに書式設定された値が表示されるテキスト ビジュアライザーで、文字列、HTML、Xml を表示できます。

例 3

この例では、ループの特定の繰り返しで中断するように条件付きブレークポイントを設定し、ループの後に配置したカーソルまで実行します。 また、テキスト ビジュアライザーで変数の値を表示します。

MainPage コンストラクターで Example3 メソッドを呼び出します。 MainPage コンストラクターを編集し、methodTrack = String.Empty; の後の行を Example3(); に置き換えます。

Call Example3 from the Demo method

ブレークポイントまで実行します。 [デバッグ] メニューの [デバッグの開始] をクリックして、デバッグ セッションを開始します (キーボード: F5 キー)。 MainPage メソッド内のブレークポイントでデバッガーの実行が中断します。

Example3 メソッドにステップ インします。 [デバッグ] メニューの [ステップ イン] をクリックし (キーボード: F11)、Example3 メソッドのエントリ ポイントに移動します。 メソッドのステップ インを続けて、for ブロックのループを 1 または 2 回繰り返します。 1000 回の繰り返しすべてをステップ実行するには長い時間がかかります。

条件付きブレークポイントを設定します。 コード ウィンドウの左側の余白で、x += i; という行を右クリックし、[条件] をクリックします。 [条件] チェック ボックスをオンにして、テキスト ボックスに「i == 500;」と入力します。 [true の場合] オプションを選択し、[OK] をクリックします。 ブレークポイントでは、for ループの 500 回目の繰り返しでの値を確認できます。

Breakpoint Condition dialog box

条件付きブレークポイント アイコンは白い十字が目印です。

Conditional breakpoint

ブレークポイントまで実行します。 [デバッグ] メニューの [続行] をクリックします (キーボード: F5)。 [ローカル] ウィンドウで、i の現在の値が 500 であることを確認します。 変数 s が 1 行に表示され、ウィンドウよりかなり長いことに注意してください。

文字列変数を視覚化します。 s の [値] 列の虫眼鏡アイコンをクリックします。

テキスト ビジュアライザー ウィンドウが表示され、文字列の値が複数行の文字列として示されます。

カーソル位置まで実行します。 methodTrack += "->Example3"; の行を右クリックし、[カーソル行の前まで実行] をクリックします (キーボード: カーソルを目的の行に移動して、Ctrl + F10)。 デバッガーは、ループの繰り返しを完了して、カーソルの行で実行を中断します。

デバッグを停止します。 [デバッグ] メニューの [デバッグの停止] をクリックします (キーボード: Shift + F5)。 これによりデバッグ セッションが終了します。

エディット コンティニュと、例外からの回復を行う

状況によっては、Visual Studio デバッガーにおいてコードで中断したときに、変数の値を変更でき、ステートメントのロジックを変更することさえできます。 この機能は、エディット コンティニュと呼ばれます。

エディット コンティニュは、例外で中断したときに特に役立ちます。 デバッグを停止し、例外を避けるために長くて複雑な手順のデバッグを再実行する代わりに、例外を "アンワインド" して実行を例外発生直前のポイントに移動してから、問題のある変数またはステートメントを変更して、例外が発生しない状態で現在のデバッグ セッションを続行できます。

エディット コンティニュはさまざまな状況で使用できますが、エディット コンティニュがサポートされない具体的な状況を指定することは困難です。状況は、プログラミング言語、プログラム スタックの現在の状態、プロセスを壊さずに状態を変更するデバッガーの機能に依存します。 編集の変更がサポートされているかどうかを判断する最良の方法は、試してみることです。変更がサポートされていない場合は、すぐにデバッガーにそのように表示されます。

例 4

この例では、デバッガーを例外まで実行し、例外を元に戻して、メソッドのロジックを修正した後、メソッドの実行を続行できるように変数の値を変更します。

MainPage コンストラクターで Example4 メソッドを呼び出します。 MainPage() コンストラクターを編集し、methodTrack = String.Empty; の後の行を Example4(); に置き換えます。

Call Example4 from the Demo method

例外まで実行します。 [デバッグ] メニューの [デバッグの開始] をクリックして、デバッグ セッションを開始します (キーボード: F5 キー)。 再び F5 キーを押して、実行を再開します。 デバッガーは Example4 メソッドの例外で実行を中断し、例外ダイアログ ボックスを表示します。

Exception dialog box

プログラム ロジックを変更します。 if 条件に誤りがあることは明らかです。x がゼロ以外のときではなく、x がゼロのときに、x の値を変更する必要があります。 [中断] をクリックして、メソッドのロジックを修正します。 行を編集しようとすると、別のダイアログ ボックスが表示されます。

Edit and Continue dialog box

[編集] をクリックし、「if (x != 0)」という行を「if (x == 0)」に変更します。 デバッガーはプログラム ロジックに対する変更をソース ファイルに保存します。

変数の値を変更します。 データ ヒントまたは [ローカル] ウィンドウで、x の値を確認します。 まだ 0 (ゼロ) になっています。 元の例外を引き起こしたステートメントを実行してみても、例外が再現するだけです。 x の値を変更できます。 [ローカル] ウィンドウで、[x] 行の [値] 列をダブルクリックします。 値を 0 から 1 に変更します。

Edit a value in the Locals window

F11 キーを押して、前に例外をスローしたステートメントにステップ インします。 エラーなしで行が実行されることに注意してください。 再度 F11 キーを押します。

デバッグを停止します。 [デバッグ] メニューの [デバッグの停止] をクリックします (キーボード: Shift + F5)。 これによりデバッグ セッションが終了します。

参照

概念

Visual Studio でのストア アプリのデバッグ セッションの開始 (VB、C#、C++、および XAML)

Visual Studio で Windows ストア アプリの中断イベント、再開イベント、およびバックグラウンド イベントをトリガーする方法

Visual Studio でのストア アプリのデバッグ