Visual Studio デバッガーを使用してコード間を移動する

Visual Studio デバッガーを使用すると、コード間を移動してアプリの状態を調査し、その実行フローを表示することができます。これは "コードのステップ実行" とも呼ばれます。 キーボード ショートカット、デバッグ コマンド、ブレークポイントなどの機能を使用して、調べるコードにすばやく移動できます。 デバッガーのナビゲーション コマンドやショートカットを使い慣れると、アプリの問題をより迅速かつ簡単に見つけて解決することができます。 コード ナビゲーションとデバッグに関連する最も一般的なキーボード ショートカットの一覧については、キーボード ショートカットに関する記事のデバッグのセクションを参照してください。

Note

コードのデバッグが今回初めてである場合は、この記事を読む前に入門者向けのデバッグデバッグの技術とツールに関する記事をご覧になることをお勧めします。

デバッグの開始とブレーク モードへの切り替え

ナビゲーション コマンドの中には、アプリを起動し、自動的にデバッガーをアタッチするものがあります。 ナビゲーションを開始するために使ったコマンドに基づいて、アプリは特定のコード行で一時停止し、"ブレーク モード" に切り替わります (つまり、アプリはデバッガーで一時停止されます)。

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

  • ブレークポイントを設定し、アプリを開始する。

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

    たとえば、Visual Studio のコード エディターでは、[カーソル行の前まで実行] コマンドを使ってアプリを起動し、デバッガーをアタッチして、ブレーク モードに切り替えます。 その後は、ステップ実行コマンドを使ってコード内を移動できます。

    Animation that shows selecting Run To Cursor and then F11.

    Animation that shows selecting Run To Cursor and then F11.

コードのステップ実行コマンドは、アプリを起動するときにも使用できますが、ブレーク モードに切り替えた後に使うのが一般的です。

一部のナビゲーション コマンドが主に使われるのは、ブレーク モード中 (つまり、デバッガーで一時停止している間) に使われます。

デバッグとブレーク モード

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

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

注意

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

コードのステップ実行

"コードのステップ実行" とは、デバッガーをアタッチした状態で、アプリケーション コードを 1 ステートメントずつ実行することです。 デバッガーのステップ実行コマンドは、各ステートメントの効果を観察し、その実行フローについて詳しく確認するのに役立ちます。

コードにステップ インする

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

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

int x = 42;
string s = "Not answered";
if( int x == 42) s = "Answered!";

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

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

ヒント

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

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

デバッグ時は、関数について気にしない場合もあります。 または、よくテストされたライブラリ コードのように、いくつかのコードが機能することを知っているかもしれません。 次のコマンドを使用すると、コードのステップ実行時にコードをスキップできます。 関数は依然として実行されますが、デバッガーではそれらはスキップされます。

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

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

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

  • ブレークポイントの設定は、ブレークポイントを再利用したいと考える場合に最適です。
  • 他のメソッドは便宜上のものであり、一時的なブレークポイントの設定と似ています。

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

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

Screenshot that shows how to set a breakpoint.

Screenshot that shows how to set a breakpoint.

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

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

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

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

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

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

    Screenshot that shows the New Function Breakpoint dialog.

    Screenshot that shows the New Function Breakpoint dialog.

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

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

Screenshot that shows breakpoints window.

Screenshot that shows breakpoints window.

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

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

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

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

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

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

カーソル位置まで強制実行

カーソル位置まで実行するには、ソース コードまたは [呼び出し履歴] ウィンドウで、中断する行を選択して右クリックし、 [カーソル行の前まで実行] を選択します。 [カーソル行の前まで実行] を選ぶと、デバッガーがカーソルのあるコード行に到達するまで、すべてのブレークポイントと初回例外がスキップされます。

クリックで実行

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

Screenshot that shows Run to Click and the green arrow.

Note

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

[Force Run to Click]\(クリックした行の前まで強制実行\)

デバッガーで一時停止している間に、Shift キーを押しながらソース コードのステートメントの上にマウス ポインターを移動して、 [Force run execution to here](ここまで強制的に実行) (二重の緑色の矢印) を選択できます。 このオプションを選択すると、アプリケーションで Visual Studio デバッガーがアタッチされ、カーソル位置で一時停止します。 実行中に検出されたすべてのブレークポイントと初回例外は一時的に無効になります。

Screenshot that shows Force Run to Click.

Note

[Force Run to Click](クリックした行の前まで強制実行) は、Visual Studio 2022 以降で使用できます。

コードを手動で中断する

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

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

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

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

注意

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

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

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

Visual Studio 2022 バージョン 17.7 以降では、外部コードにステップインするときに、デバッグ シンボルを手動で読み込む必要なく、.NET コードを自動コンパイルできます。 詳細については、「デバッグ中に .NET アセンブリからソース コードを生成する」を参照してください。

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

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

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

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

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

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

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

黄色の実行ポインターを移動することで、次に実行されるステートメントを変更できます。 この機能はブレーク モード中に使用できます。

これは高度なデバッガー機能です。 詳細については、「実行ポインターを移動する」を参照してください。