次の方法で共有


クイック スタート: デバッガーのナビゲーション (Xaml および C#)

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

このクイック スタートは、Visual Studio でのデバッグを初めて行う開発者、および Visual Studio のデバッグ セッションでの移動について理解を深めたい開発者を対象とした内容になっています。デバッグ技法自体については説明しません。サンプル コードのメソッドは、このトピックで説明しているデバッグ手順を示すためだけに設計されています。アプリケーションまたは関数の設計に関するベスト プラクティスには従っていません。実際、メソッドやアプリ自体ではたいした処理は何も行われていないことがすぐにわかります。

このクイック スタートの各セクションは、できるだけ相互に依存しないように設計されています。したがって、既によく理解している情報に関するセクションは省略してかまいません。また、サンプル アプリケーションを作成する必要はありません。ただし、作成してみることをお勧めします。できるだけ簡単に作成できるようにしてあります。

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

このトピックの内容

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

  • Create the sample app

  • Set and run to a breakpoint, step into a method, and examine program data

  • Step into, over, and out of methods

  • Set a conditional breakpoint, run to the cursor, and visualize a variable

  • Edit and continue, recover from an exception

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

デバッグはコードに関することなので、サンプル アプリでは、Windows ストア アプリのフレームワークをソース ファイルの作成だけに使用し、デバッグ セッション内のナビゲーション方法およびプログラムの状態を調べて変更する方法がわかるようにします。呼び出すコードはすべて、メイン ページのコンストラクターから呼び出します。コントロールは追加せず、イベントは処理しません。

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

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

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

以上でこのトピックの例に従って作業を進めることができます。

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

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

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

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

Hh441470.collapse_all(ja-jp,VS.110).gif例 1

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

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

ステップ イン

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

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

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

ブレークポイントの設定

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

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

カレント行

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

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

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

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

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

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

デバッガー データヒント

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

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

[ローカル] ウィンドウ

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

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

[ウォッチ] ウィンドウ

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

メソッドをステップ イン、ステップ オーバー、ステップ アウトする

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

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

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

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

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

Hh441470.collapse_all(ja-jp,VS.110).gif例 2

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

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

Demo メソッドから Example2 メソッドを呼び出す

ブレークポイントまで実行します。[デバッグ] メニューの [デバッグの開始] をクリックして、デバッグ セッションを開始します (キーボード: 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 を表示できます。

Hh441470.collapse_all(ja-jp,VS.110).gif例 3

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

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

Demo メソッドから Example3 メソッドを呼び出す

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

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

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

[ブレークポイントの条件] ダイアログ ボックス

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

条件付きブレークポイント

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

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

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

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

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

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

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

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

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

Hh441470.collapse_all(ja-jp,VS.110).gif例 4

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

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

Demo メソッドから Example4 メソッドを呼び出す

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

[例外] ダイアログ ボックス

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

[エディット コンティニュ] ダイアログ ボックス

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

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

[ローカル] ウィンドウの値の編集

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

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

参照

概念

デバッグ セッションを開始する方法 (Visual C++、Visual C#、および Visual Basic)

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

Windows ストア アプリのデバッグ