Visual Studio でのデバッガーの生産性に関するヒントとテクニックについて学習する

このトピックでは、Visual Studio デバッガーの生産性に関するヒントとテクニックについて説明します。 デバッガーの基本的な機能については、「デバッガーでのはじめに」を参照してください。 このトピックでは、機能ツアーに含まれていないいくつかの領域について説明します。

キーボード ショートカット

デバッグに関連する最も一般的なキーボード ショートカットの一覧については、キーボード ショートカットに関する記事のデバッグのセクションを参照してください。

データ ヒントをピン留めする

デバッグ中にデータ ヒントを頻繁にポイントする場合は、変数のデータ ヒントをピン留めして、すぐにアクセスできるようにすることができます。 変数は、再起動後もピン留めされたままです。 データ ヒントをピン留めするには、データ ヒントをポイントしてピン アイコンをクリックします。 複数の変数をピン留めすることができます。

データ ヒントのピン

また、データ ヒントを展開したままにしたり ("スティッキー データ ヒント")、データ ヒントを透明にするなど、他にもいくつかの方法でデータ ヒントをカスタマイズできます。 詳しくは、「コード エディターでデータヒントのデータ値を表示する」をご覧ください。

コードを編集してデバッグを続行する (C#、VB、C++)

Visual Studio でサポートされているほとんどの言語で、デバッグ セッション中にコードを編集し、デバッグを続行できます。 この機能を使用するには、デバッガーの一時停止中にカーソルを使用してコードをクリックし、編集を行い、F5F10、または F11 キーを押してデバッグを続行します。

ディット コンティニュのデバッグ

機能の使用および機能制限の詳細については、エディット コンティニュに関するページを参照してください。

XAML コードを編集してデバッグを続行する

デバッグ セッション中に XAML コードを変更するには、XAML ホット リロードで実行中の XAML コードを記述およびデバッグする方法に関するページを参照してください。

再現するのが困難な問題をデバッグする

アプリで特定の状態を再現することが難しい場合や時間がかかる場合は、条件付きブレークポイントを使用すると効果があるかどうかを検討します。 条件付きブレークポイントを使用し、ブレークポイントをフィルター処理することで、アプリが目的の状態 (変数に不適切なデータが格納された状態など) になるまで、アプリ コードが中断されないようにすることができます。 式、フィルター、ヒット カウントなどを使用して、条件を設定できます。

条件付きブレークポイントを作成するには

  1. ブレークポイント アイコン (赤い球) を右クリックして、[条件] を選択します。

  2. [ブレークポイントの設定] ウィンドウで、式を入力します。

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

  3. 別の種類の条件に関心がある場合は、 [ブレークポイントの設定] ダイアログ ボックスで [条件式] の代わりに [フィルター] を選択して、フィルターのヒントに従います。

デバッガーに表示されっるようにデータを構成する

C#、Visual Basic、C++ (C++/CLI コードのみ) の場合、DebuggerDisplay 属性を使用して、表示する情報をデバッガーに指定できます。 C++ コードの場合は、Natvis の視覚化を使用して同じことを行うことができます。

同じアプリケーションに繰り返しアタッチする

プロセスにアタッチする機能を使用している場合は、[デバッグ]>[プロセスに再アタッチする] ([Shift]+[Alt]+[P]) を選択することで、以前にアタッチしたプロセスにすばやく再アタッチできます。 このコマンドを選択すると、デバッガーでは、接続した最後のプロセスへのアタッチが直ちに試行されます。その際に、まず以前のプロセス ID との照合が試行され、それが失敗した場合は以前のプロセス名と照合されます。 一致するものが見つからない場合、または同じ名前のプロセスが複数ある場合は、[プロセスにアタッチ] ダイアログ ボックスが開き、正しいプロセスを選択できます。

スコープ外のオブジェクトを追跡する (C#、Visual Basic)

[ウォッチ] ウィンドウのようなデバッガー ウィンドウを使用して、変数を簡単に表示できます。 ただし、[ウォッチ] ウィンドウで変数がスコープ外になると、淡色表示になることがわかります。アプリのシナリオによっては、変数がスコープ外になった場合でも変数の値が変更されることがあり、それを細かく監視したいことがあります (たとえば、変数がガベージ コレクトされる可能性があります)。 [ウォッチ] ウィンドウで変数のオブジェクト ID を作成することで、変数を追跡できます。

オブジェクト ID を作成するには

  1. 追跡する変数の近くにブレークポイントを設定します。

  2. デバッガーを開始し (F5 キー)、ブレークポイントで停止します。

  3. [ローカル] ウィンドウ([デバッグ] > [ウィンドウ] > [ローカル]) で変数を探し、変数を右クリックして、[オブジェクト ID の作成] を選びます。

    オブジェクト ID を作成する

  4. $ ウィンドウに、 [ローカル] ウィンドウを閉じます。 この変数はオブジェクト ID です。

  5. オブジェクト ID 変数を右クリックし、[ウォッチの追加] を選択します。

詳細については、オブジェクト ID の作成に関するページを参照してください。

関数の戻り値を表示する

関数の戻り値を表示するには、コードのステップ実行中に、[自動変数] ウィンドウに表示されている関数を調べます。 関数の戻り値を調べるには、対象の関数が既に実行されていることを確認します (関数呼び出しで現在停止している場合は F10 キーを 1 回押します)。 ウィンドウが閉じている場合は、[デバッグ] > [ウィンドウ] > [自動変数] を使用して、[自動変数] ウィンドウを開きます。

[自動変数] ウィンドウ

また、 [イミディエイト] ウィンドウで関数を入力して、戻り値を表示することもできます。 ([デバッグ] > [ウィンドウ] > [イミディエイト] を使用して開きます)。

[イミディエイト] ウィンドウ

また、 [ウォッチ] ウィンドウと [イミディエイト] ウィンドウでは、$ReturnValue などの擬似変数を使用することもできます。

ビジュアライザーで文字列を調べる

文字列を使用する場合、書式設定された文字列全体を表示すると便利なことがあります。 プレーンテキスト、XML、HTML、または JSON の文字列を表示するには、文字列値が含まれる変数をポイントして、虫眼鏡アイコン VisualizerIcon をクリックします。

文字列ビジュアライザーを開く

文字列ビジュアライザーは、文字列の種類に応じて、文字列の形式が正しくないかどうかを調べるのに役立ちます。 たとえば、空白の [値] フィールドは、ビジュアライザーの種類によって文字列が認識されないことを示します。 詳細については、「[String ビジュアライザー] ダイアログ ボックス」を参照してください。

JSON 文字列ビジュアライザー

デバッガー ウィンドウに表示される DataSet オブジェクトや DataTable オブジェクトなどの他のいくつかの型については、組み込みビジュアライザーを開くこともできます。

メモリ使用量の分析

ヒープのスナップショットを取得して比較し、メモリ使用量を最適化し、メモリ使用量ツールを使用してメモリ リークを見つけることができます。 詳細については、メモリ分析ツールの選択に関する記事を参照してください。

ダンプ ファイルを作成する

"ダンプ ファイル" は、実行されていたプロセスと、ある時点でアプリに対して読み込まれたモジュールを示すスナップショットです。 ヒープ情報を含むダンプには、その時点でのアプリのメモリのスナップショットも含まれます。 ダンプは、ほとんどの場合、開発者がアクセス権を持たないコンピューターで生じた問題をデバッグするために使用されます。

ダンプ ファイルを保存する必要がある場合は、[デバッグ] > [名前を付けてダンプを保存] を選択します。

ダンプ ファイルを分析するには、Visual Studio で [ファイル] > [開く] を選択します。 ダンプ ファイルを使用してデバッグを開始するには、[Debug with Managed Only]\(マネージドのみでデバッグ\)[ネイティブのみでデバッグ][混合でデバッグ]、または [Debug with Managed Memory]\(マネージド メモリでデバッグ\) を選択します。

詳細については、ダンプ ファイルに関する記事を参照してください。

ハンドルされる例外でコードを中断する

デバッガーでは、ハンドルされない例外でコードを中断します。 しかし、ハンドルされる例外 (try/catch ブロック内で発生する例外など) もバグの原因になる可能性があり、発生した場合は調査する必要があります。 [例外設定] ダイアログ ボックスでオプションを構成することにより、ハンドルされる例外でもコードを中断するようにデバッガーを構成できます。 [デバッグ] > [ウィンドウ] > [例外設定] を選んで、このダイアログ ボックスを開きます。

[例外設定] ダイアログ ボックスを使用すると、特定の例外でコードを中断するようにデバッガーに指示できます。 次の図では、System.NullReferenceException が発生するたびにデバッガーはコードを中断します。 詳細については、例外の管理に関するページを参照してください。

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

実行フローを変更する

デバッガーがコード行で一時停止したら、マウスを使用して、左側の黄色い矢印ポインターをグラブします。 黄色い矢印ポインターをコード実行パスの別の場所に移動します。 その後、F5 キーまたはステップ コマンドを使用して、アプリの実行を続行します。

実行ポインターを移動する

実行フローを変更することにより、さまざまなコード実行パスをテストしたり、デバッガーを再起動することなくコードを再実行したりできます。 詳細については、「実行ポインターを移動する」を参照してください。

警告

多くの場合、この機能には注意する必要があり、ツールヒントに警告が表示されます。 他の警告が表示される場合もあります。 ポインターを移動しても、アプリを以前のアプリケーション状態に戻すことはできません。

デッドロックと競合の状態をデバッグする

マルチスレッド アプリに共通する問題の種類をデバッグする必要がある場合、デバッグ中にスレッドの場所を確認すると役に立つことがよくあります。 これは、[ソースのスレッドを表示] ボタンを使用して簡単に行うことができます。

ソース コードのスレッドを表示するには:

  1. デバッグ中に、[デバッグ] ツール バーの [ソースのスレッドを表示] ボタン ソースのスレッドを表示 をクリックします。

  2. ウィンドウ左端の余白に注目します。 この行には、2 本の布糸に似た "スレッド マーカー" アイコン スレッド マーカー が表示されます。 スレッド マーカーは、スレッドが停止している位置を示します。

    スレッド マーカーは、ブレークポイントによって部分的に隠されている場合があることに注意してください。

  3. スレッド マーカーの上にポインターを置きます。 DataTip が表示されます。 データヒントは、停止したスレッドごとに名前とスレッド ID 番号を表示します。

    [並列スタック] ウィンドウでスレッドの場所を表示することもできます。

アプリにデバッガーをアタッチする方法について理解を深める (C#、C++、Visual Basic、F#)

実行中のアプリにアタッチするために、デバッガーでは、デバッグ対象のアプリとまったく同じビルド用に生成されたシンボル (.pdb) ファイルが読み込まれます。 場合によっては、シンボル ファイルに関する知識が少しあると役に立つことがあります。 Visual Studio でシンボル ファイルがどのように読み込まれているかは、[モジュール] ウィンドウを使用して調べることができます。

デバッグ中に [デバッグ] [ウィンドウ] [モジュール]> を選んで、>[モジュール] ウィンドウを開きます。 [モジュール] ウィンドウでは、デバッガーによってユーザー コード ("マイ コード") として扱われているモジュールや、モジュールのシンボル読み込み状態を確認できます。 ほとんどのシナリオでは、ユーザー コードのシンボル ファイルはデバッガーによって自動的に検出されますが、.NET コード、システム コード、またはサードパーティのライブラリ コードにステップ イン (デバッグ) する場合は、正しいシンボル ファイルを取得するために追加の手順が必要になります。

[モジュール] ウィンドウでシンボル情報を表示する

[モジュール] ウィンドウで右クリックして [シンボルの読み込み] を選択することで、シンボル情報を直接読み込むことができます。

場合によっては、(フットプリントを削減するため) アプリに一致するシンボル ファイルが付属していなくても、アプリ開発者は、後でリリースされるバージョンをデバッグできるように、ビルドと一致するシンボル ファイルのコピーを保持していることがあります。

デバッガーでコードがユーザー コードとして分類される方法については、マイ コードのみに関するページを参照してください。 シンボル ファイルの詳細については、「Visual Studio デバッガーでのシンボル (.pdb) ファイルとソース ファイルの指定」を参照してください。

詳細情報

その他のヒントとテクニックおよびさらに詳しい情報については、次のブログ投稿を参照してください。

キーボード ショートカット