Visual Studio デバッガーでコード間を移動する

Visual Studio デバッガーを使用すると、コード間を移動してアプリの状態を調査し、その実行フローを表示することができます。 キーボード ショートカット、デバッグ コマンド、ブレークポイントなどの機能を使用して、調べるコードにすばやく移動できます。 デバッガーのナビゲーション コマンドやショートカットを使い慣れることで、アプリの問題をすばやく見つけて解決することができます。

注意

コードのデバッグを試みるのが今回初めてである場合は、この記事を先に進む前に「入門者向けのデバッグ」および「デバッグの技術とツール」を参照することをお勧めします。

"中断モード" に移行する

"中断モード" では、関数、変数、オブジェクトをメモリに保持したまま、アプリの実行が中断されます。 デバッガーが中断モードになったら、コード間を移動できます。 中断モードにすばやく移行する最も一般的な方法は、次のいずれかです。

  • F10 キーまたは F11 キーを押して、コードのステップ実行を開始します。 これにより、アプリのエントリ ポイントをすばやく見つけることができ、その後、ステップ コマンドを使用してコード間を移動することができます。

  • 特定の場所または関数まで実行します。たとえば、ブレークポイントを設定して、アプリを開始します。

    たとえば、Visual Studio のコード エディターでは、 [カーソル行の前まで実行] コマンドを使用してアプリを起動し、デバッガーをアタッチして、中断モードにし、F11 キーを押してコード間を移動できます。

    カーソル行の前まで実行してコードにステップインする

中断モードになったら、さまざまなコマンドを使用してコード間を移動できます。 中断モードでは、変数の値を調べて、違反やバグを探すことができます。 一部のプロジェクトの種類では、中断モードでアプリの調整を行うこともできます。

[モジュール] ウィンドウや [ウォッチ] ウィンドウなど、ほとんどのデバッガー ウィンドウは、デバッガーがアプリにアタッチされている場合にのみ使用できます。 [ローカル] ウィンドウでの変数値の表示や [ウォッチ] ウィンドウでの式の評価など、デバッガーの一部の機能は、デバッガーが一時停止している間 (つまり中断モード) だけ使用できます。

注意

ソース ファイルやシンボル ( .pdb) ファイルが読み込まれていないコードで中断した場合、デバッガーには [ソース ファイルが見つかりません] または [シンボルが見つかりません] ページが表示され、ファイルを見つけて読み込むのに役立ちます。 シンボル (.pdb) ファイルとソース ファイルの指定に関する記事をご覧ください。 シンボル ファイルまたはソース ファイルを読み込むことができない場合でも、 [逆アセンブル] ウィンドウでアセンブリ命令をデバッグできます。

コードのステップ実行

デバッガーのステップ コマンドを使用すると、アプリの状態を調べたり、実行フローの詳細を確認したりすることができます。

コードを 1 行ずつステップインする

デバッグ中に各ステートメントで実行を停止するには、 [デバッグ] > [ステップ イン] を使用するか、F11 キーを押します。

デバッガーでは、物理的な行ではなく、コード ステートメントがステップ実行されます。 たとえば、if 句は 1 行で記述できます。

int x = 42;
string s = "Not answered";
if( int x == 42) s = "Answered!";
Dim x As Integer = 42
Dim s As String = "Not answered"
If x = 42 Then s = "Answered!"

ただし、この行にステップ インすると、デバッガーでは条件を 1 つのステップとし、結果は別のステップとして扱われます。 前の例では、条件は true になっります。

入れ子になった関数呼び出しの場合は、 [ステップ イン] をクリックすると、一番内側にある入れ子になった関数にステップ インします。 たとえば、Func1(Func2()) のような呼び出しに [ステップ イン] を使用すると、デバッガーは関数 Func2 にステップ インします。

ヒント

各コード行を実行しながら、変数をポイントして値を表示したり、[ローカル] ウィンドウや [ウォッチ] ウィンドウを使用して値の変化を監視したりできます。 また、関数にステップ インしている間に呼び出し履歴を視覚的にトレースすることもできます。 (Visual Studio Enterprise の場合のみ、デバッグを行うときの呼び出し履歴に対するメソッドのマップに関するページを参照してください)。

コードをステップ実行し、一部の関数をスキップする

デバッグ中に関数が気にならない場合や、適切にテストされたライブラリ コードのように動作することがわかっている場合があります。 次のコマンドを使用すると、コードのステップ実行中にコードをスキップできます。 関数は依然として実行されますが、デバッガーではそれらはスキップされます。

キーボード コマンド [デバッグ] メニューのコマンド 説明
F10 [ステップ オーバー] 現在の行に関数呼び出しが含まれている場合、 [ステップ オーバー] を使用すると、そのコードが実行された後、呼び出された関数から制御が戻った後の最初のコード行で、実行が中断されます。
Shift+F11 [ステップ アウト] [ステップ アウト] では、コードの実行が継続され、現在の関数から制御が戻ったときに実行が中断されます。 デバッガーでは現在の関数はスキップされます。

特定の場所または関数まで実行する

調査対象のコードが正確にわかっている場合や、デバッグを開始する場所がわかっている場合は、特定の場所または関数まで直接実行するのが望ましいことがあります。

コード内にブレークポイントまで実行する

コードに単純なブレークポイントを設定するには、実行を中断するコード行の左端の余白をクリックします。 行を選択して、F9 キーを押すか、 [デバッグ] > [ブレークポイントの設定/解除] を選択するか、右クリックして [ブレークポイント] > [ブレークポイントの挿入] を選択することもできます。 コード行の左横の余白に、ブレークポイントが赤い点として表示されます。 デバッガーは、その行が実行される直前で実行を中断します。

ブレークポイントを設定する

Visual Studio でのブレークポイントには、条件付きブレークポイントやトレースポイントなど、さまざまな追加の機能が用意されています。 詳細については、ブレークポイントの使用に関するページを参照してください。

関数のブレークポイントまで実行する

デバッガーに対して、指定した関数に達するまで実行するように指示できます。 関数は名前で指定することも、呼び出し履歴から選択することもできます。

関数のブレークポイントを名前で指定するには

  1. [デバッグ] > [新しいブレークポイント] > [関数のブレークポイント] を選択します

  2. [新しい関数のブレークポイント] ダイアログで、関数の名前を入力し、その言語を選択します。

    [新しい関数のブレークポイント] ダイアログ ボックス

  3. [OK] を選択します。

関数がオーバーロードされている場合、または複数の名前空間にある場合は、 [ブレークポイント] ウィンドウで目的の関数を選択できます。

オーバーロードされた関数のブレークポイント

呼び出し履歴から関数のブレークポイントを選択するには

  1. デバッグ中に、 [デバッグ] > [ウィンドウ] > [呼び出し履歴] を選択して、 [呼び出し履歴] ウィンドウを開きます。

  2. [呼び出し履歴] ウィンドウで関数を右クリックし、 [カーソル行の前まで実行] を選択するか、Ctrl + F10 キーを押します。

呼び出し履歴を視覚的にトレースするには、デバッグを行うときの呼び出し履歴に対するメソッドのマップに関するページを参照してください。

カーソル位置まで実行する

カーソル位置まで実行するには、ソース コードまたは [呼び出し履歴] ウィンドウで、中断する行を選択して右クリックし、 [カーソル行の前まで実行] を選択するか、Ctrl + F10 キーを押します。 [カーソル行の前まで実行] を選択するのは、一時的なブレークポイントを設定するのと似ています。

[Run To Click (クリックで実行)]

デバッガーで一時停止している間に、ソース コードまたは [逆アセンブリ] ウィンドウでステートメントをポイントし、 [ここまで実行します] の緑色の矢印アイコンを選択します。 [Run to Click](クリックで実行) を使用すると、一時的なブレークポイントを設定する必要がなくなります。

クリックで実行

注意

[Run to Click](クリックで実行) は Visual Studio 2017 以降で使用できます。

コードを手動で中断する

実行中のアプリの次に使用可能なコード行で中断するには、 [デバッグ] > [すべて中断] を選択するか、Ctrl + Alt + Break キーを押します。

ポインターを移動して実行フローを変更する

デバッガーが一時停止しているとき、ソース コードまたは [逆アセンブル] ウィンドウの余白に表示される黄色の矢印は、次に実行されるステートメントの位置を示します。 この矢印を移動して、次に実行されるステートメントを変更できます。 コードの一部分をスキップしたり、前の行に戻ったりできます。 ポインターを移動すると、既知のバグを含むコードのセクションをスキップするなどの場合に便利です。

ポインターを移動する

次に実行するステートメントの変更は、デバッガーの中断モード時に行う必要があります。 ソース コードまたは [逆アセンブル] ウィンドウで、黄色の矢印を別の行にドラッグするか、次に実行する行を右クリックして [次のステートメントの設定] を選択します。

プログラム カウンターは、新しい場所まで直接ジャンプします。古い実行ポイントと新しい実行ポイントの間の命令は実行されません。 ただし、実行ポイントを後方に移動した場合、その間の命令が元に戻されることはありません。

注意事項

  • 次に実行するステートメントを別の関数やスコープに移動すると、一般に呼び出し履歴が破損し、実行時エラーや例外が発生する原因になります。 次に実行するステートメントを別のスコープに移動しようとすると、デバッガーの警告ダイアログ ボックスが表示され、操作をキャンセルできます。
  • Visual Basic では、次に実行するステートメントを別のスコープや関数に移動できません。
  • ネイティブ C++ でランタイム チェックを有効にしている場合、次に実行されるステートメントを設定すると、実行がメソッドの最後に到達したときに例外がスローされる可能性があります。
  • エディット コンティニュが有効になっている場合、エディット コンティニュが即座にマップし直すことができない編集が行われると、 [次のステートメントの設定] でエラーが発生します。 これは、たとえば、catch ブロック内でコードを編集している場合に発生します。 このエラーが発生すると、その操作がサポートされていないことを知らせるエラー メッセージが表示されます。
  • マネージド コードでは、以下の場合、次に実行するステートメントは移動できません。
    • 次のステートメントが現在のステートメントとは別のメソッドに含まれている場合。
    • デバッグが、Just-In-Time デバッグによって開始された場合。
    • 呼び出し履歴のアンワインドが行われている場合。
    • System.StackOverflowException 例外または System.Threading.ThreadAbortException 例外がスローされた場合。

非ユーザー コードをデバッグする

既定の状態のデバッガーでは、"マイ コードのみ" と呼ばれる設定を有効にすることにより、アプリ コードのみのデバッグが試みられます。 この機能が異なるプロジェクトの種類および言語に対してどのように機能するか、およびそれをカスタマイズする方法の詳細については、マイ コードのみに関するページを参照してください。

デバッグ中にフレームワークのコード、サードパーティのライブラリ コード、またはシステム呼び出しを調べるには、"マイ コードのみ" を無効にします。 [ツール] (または [デバッグ] ) > [オプション] > [デバッグ中] で、 [マイ コードのみを有効にする] チェック ボックスをオフにします。 "マイ コードのみ" が無効になっている場合、デバッガー ウィンドウに非ユーザー コードが表示され、デバッガーは非ユーザー コードにステップ インできます。

注意

"マイ コードのみ" デバッグは、デバイス プロジェクトではサポートされません。

システム コードをデバッグする

Microsoft システム コードのデバッグ シンボルが読み込まれていて、"マイ コードのみ" が無効になっている場合は、他の呼び出しと同様にシステム コールにステップ インできます。

Microsoft のシンボルを読み込む方法については、「シンボルの場所と読み込みオプションを構成する」を参照してください。

特定のシステム コンポーネントのシンボルを読み込むには:

  1. デバッグ中に、 [デバッグ] > [ウィンドウ] > [モジュール] を選択するk、Ctrl + Alt + U キーを押して、 [モジュール] ウィンドウを開きます。

  2. [モジュール] ウィンドウの [シンボルの状態] 列で、シンボルが読み込まれているモジュールを確認できます。 シンボルを読み込むモジュールを右クリックして、 [シンボルの読み込み] を選択します。

マネージド コード内のプロパティと演算子にステップ インする

デバッガーは既定ではマネージド コード内のプロパティと演算子をステップ オーバーします。 ほとんどの場合、これにより正しくデバッグを実行できます。 プロパティまたは演算子へのステップ インを有効にするには、 [デバッグ] > [オプション] を選択します。 [デバッグ] > [全般] ページで、 [プロパティおよび演算子をステップ オーバーする (マネージドのみ)] チェック ボックスをオフにします。

関連項目