Share via


Visual Studio で Just-In-Time デバッガーを使用してデバッグする

Just-In-Time デバッグは、Visual Studio の外部で実行中のアプリでエラーまたはクラッシュが発生したときに、Visual Studio を自動的に起動できます。 Just-In-Time デバッグを使用すると、Visual Studio の外部でアプリをテストでき、問題が発生したときに Visual Studio を開いてデバッグを開始できます。

Just-In-Time デバッグは、Windows デスクトップ アプリで使用できます。 ユニバーサル Windows アプリや、ビジュアライザーなどのネイティブ アプリケーションでホストされているマネージド コードでは機能しません。

ヒント

[Just-In-Time デバッガー] ダイアログ ボックスの表示を停止したいとき、Visual Studio がインストールされていない場合は、「Just-In-Time デバッガーを無効にする」を参照してください。 Visual Studio がインストールされていた場合は、Windows レジストリで Just-In-Time デバッグを無効にする必要があります。

Visual Studio で Just-In-Time デバッグを有効または無効にする

Just-In-Time デバッグは、Visual Studio の [ツール]>[オプション] (または [デバッグ]>[オプション]) ダイアログ ボックスで構成できます。

Note

Just-In-Time デバッグを有効または無効にするには、Visual Studio を管理者として実行している必要があります。 Just-In-Time デバッグを有効または無効にするとレジストリ キーが設定され、そのキーを変更するには管理者特権が必要になります。 管理者として Visual Studio を開くには、Visual Studio アプリを右クリックし、[管理者として実行] を選択します。

Just-In-Time デバッグの有効/無効を切り替えるには:

  1. [ツール] または [デバッグ] メニューで、[オプション]>[デバッグ]>[Just-In-Time] を選択します。

    Enable or disable JIT debugging

    Note

    Just-In-Time メニュー オプションが表示されない場合は、Visual Studio インストーラーを使用して Just-In-Time デバッガーがインストールされていることを確認します。

  2. [このコードの種類の Just-In-Time デバッグを有効にする] ボックスで、Just-In-Time デバッグでデバッグするコードの種類を選択します。[マネージド][ネイティブ]、または [スクリプト]

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

Just-In-Time デバッガーを有効にしたが、アプリのクラッシュやエラーの際に開かない場合は、「Just-In-Time デバッグのトラブルシューティング」を参照してください。

Windows レジストリで Just-In-Time デバッグを無効にする

Visual Studio がコンピューターにインストールされなくなった場合でも、Just-In-Time デバッグが有効になっている可能性があります。 Visual Studio がもうインストールされていない場合は、Windows レジストリを編集して Just-In-Time デバッグを無効にできます。

レジストリを編集して Just-In-Time デバッグを無効にするには:

  1. Windows の [スタート] メニューで、レジストリ エディター (regedit.exe) を実行します。

  2. [レジストリ エディター] ウィンドウで、次のレジストリ エントリを探して、存在する場合は削除します。

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    JIT registry key

  3. また、次のレジストリ エントリが存在する場合も削除します。

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger

    • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

    他のレジストリ キーを削除または変更しないようにしてください。

  4. [レジストリ エディター] ウィンドウを閉じます。

Windows フォームの Just-In-Time デバッグを有効化する

Windows フォーム アプリには既定で最高レベルの例外ハンドラーがあり、回復可能であればアプリは実行し続けることができます。 Windows フォーム アプリが、ハンドルされない例外をスローすると、次のダイアログが表示されます。

Windows Form unhandled exception

標準の Windows フォーム エラー処理の代わりに Just-In-Time デバッグを有効にするには、次の設定を追加します。

  • machine.config または <app name>.exe.config ファイルの system.windows.forms セクションで、jitDebugging 値を true に設定します。

    <configuration>
        <system.windows.forms jitDebugging="true" />
    </configuration>
    
  • さらに、C++ Windows フォーム アプリケーションでは、.config ファイルまたはコード内で DebuggableAttributetrueに設定することも必要です。 /Zi を使用し、/Og は使用しないでコンパイルすると、コンパイラによってこの属性が設定されます。 ただし、最適化されていないリリース ビルドをデバッグする場合は、アプリの AssemblyInfo.cpp ファイルに次の行を追加して、DebuggableAttribute を設定する必要があります:

    [assembly:System::Diagnostics::DebuggableAttribute(true, true)];
    

    詳細については、DebuggableAttributeを参照してください。

Just-In-Time デバッグを使用する

この例では、アプリがエラーをスローした場合の Just-In-Time デバッグについて説明します。

  • これらのステップを実行するには、Visual Studio をインストールする必要があります。 Visual Studio をインストールしていない場合は、無料の Visual Studio Community エディションをダウンロードできます。

  • [ツール]>[オプション]>[デバッグ]>[Just-In-Time] で、Just-In-Time デバッグが有効になっていることを確認します。

この例では、NullReferenceException をスローする C# コンソール アプリを Visual Studio で作成します。

  1. Visual Studio で、ThrowsNullExceptionという名前の C# コンソール アプリを作成します ([ファイル]>[新規作成]>[プロジェクト]>[Visual C#]>[コンソール アプリケーション])。 Visual Studio でのプロジェクトの作成の詳細については、シンプルなアプリケーションを作成するチュートリアルのページを参照してください。

  2. プロジェクトが Visual Studio で開いたら、Program.cs ファイルを開きます。 Main() メソッドを次のコードで置き換えます。これは、行をコンソールに出力して、NullReferenceException をスローします。

    static void Main(string[] args)
    {
        Console.WriteLine("we will now throw a NullReferenceException");
        throw new NullReferenceException("this is the exception thrown by the console app");
    }
    
  3. ソリューションをビルドするには、[デバッグ] (既定) または [リリース] 構成を選択してから、[ビルド]>[ソリューションのリビルド] を選択します。

    Note

    • 完全なデバッグ エクスペリエンスのためには、[デバッグ] 構成を選択します。
    • [リリース] 構成を選択する場合、この手順を行うためには [マイ コードのみ] をオフにする必要があります。 [ツール]>[オプション]>[デバッグ] で、[マイ コードのみを有効にする] を選択解除します。

    ビルド構成の詳細については、「ビルド構成について」を参照してください。

  4. C# プロジェクト フォルダー (...\ThrowsNullException\ThrowsNullException\bin\Debug または ...\ThrowsNullException\ThrowsNullException\bin\Release) にある、ビルドされたアプリ ThrowsNullException.exe を開きます。

    次のコマンド ウィンドウが表示されます。

    Screenshot of the console for ThrowsNullException.exe, which throws an unhandled null reference exception (System.NullReferenceException).

  5. [Just-In-Time デバッガーを選択する] ダイアログが開きます。

    Screenshot of the Choose Just-In-Time Debugger dialog box, which appears after the exception appears in the ThrowsNullException.exe console window.

    [Available Debuggers]\(使用可能なデバッガー\) で、[New instance of<your preferred Visual Studio version/edition>]\(<優先 Visual Studio バージョン/エディション> の新しいインスタンス\)> を選択します (まだ選択されていない場合)。

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

    ThrowsNullException プロジェクトが、Visual Studio の新しいインスタンスで開きます。例外をスローした行で実行が停止しています。

    Screenshot of the ThrowsNullException project in Visual Studio, with highlighting of the line of source code that threw the exception.

この時点でデバッグを開始できます。 実際のアプリをデバッグする場合は、コードが例外をスローする理由を確認する必要があります。

注意事項

アプリに信頼できないコードが含まれている場合は、[セキュリティ警告] ダイアログ ボックスが表示され、デバッグを続行するかどうかを決定できます。 デバッグを開始する前に、コードを信頼できるかどうかを判断します。 このコードは、自分で作成したコードですか。 アプリケーションをリモート コンピューター上で実行している場合、プロセスの名前を識別できますか。 アプリがローカルで実行している場合は、悪意のあるコードがコンピューター上で実行されている可能性も考慮してください。 コードが信頼できると判断した場合は、[OK]を選択します。 それ以外の場合、 [キャンセル] を選択します。

Just-In-Time デバッグのトラブルシューティング

Visual Studio で有効になっている場合でも、アプリがクラッシュしたときに Just-In-Time デバッグが開始されない場合:

  • Windows の既知の問題により、Just-In-Time デバッガーが失敗する可能性があります。

    解決するには、次のレジストリ キーに [自動][DWORD 値][値のデータ]1 として追加します。

    • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug

    • (32 ビット コンピューターの場合) HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

  • Windows エラー報告が、コンピューター上でエラー処理を引き継いだ可能性があります。

    この問題を解決するには、レジストリ エディターを使用し、次のレジストリ キーに [無効][DWORD 値][値のデータ]1 として追加します。

    • HKEY_LOCAL_MACHINE\Software\WOW6432Node\Microsoft\Windows\Windows Error Reporting

    • (32 ビット コンピューターの場合) HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting

    詳細については、「WER 設定」を参照してください。

Just-In-Time デバッグの際に次のエラー メッセージが表示されることがあります。

  • クラッシュ プロセスにアタッチできません。 指定されたプログラムは、Windows または MS-DOS プログラムではありません。

    デバッガーが、別のユーザーで実行されているプロセスにアタッチしようとしました。

    この問題を回避するには、Visual Studio で [デバッグ]>[プロセスにアタッチ] を開き (または、Ctrl + Alt + P を押して)、[選択可能なプロセス] の一覧でデバッグするプロセスを見つけます。 プロセスの名前がわからない場合は、Visual Studio Just-In-Time デバッガー ダイアログでプロセス ID を見つけます。 そのプロセスを [選択可能なプロセス]の一覧から選択し、[アタッチ] を選択します。 [いいえ] を選択して、[Just-In-Time デバッガー] ダイアログを閉じます。

  • ログオンしているユーザーがいないため、デバッガーを開始できませんでした。

    コンソールにログオンしているユーザーはいないため、Just-In-Time デバッグ ダイアログを表示するユーザー セッションはありません。

    この問題を解決するには、コンピューターにログオンします。

  • クラスは登録されていません。

    デバッガーは、おそらくインストールの問題が原因で登録されていない COM クラスを作成しようとしました。

    この問題を解決するには、Visual Studio インストーラーを使って Visual Studio を再インストールするか、既存のインストールを修復します。