Visual Studio デバッガーで実行中のプロセスへのアタッチ

ローカルまたはリモート コンピューターで実行中のプロセスに、Visual Studio デバッガーをアタッチできます。 プロセスの実行後、Visual Studio で [デバッグ]>[プロセスにアタッチ] を選択するか Ctrl+Alt+p キーを押し、[プロセスにアタッチ] ダイアログを使用してプロセスにデバッガーをアタッチします。

[プロセスにアタッチ] を使用すると、デバッガーをアタッチした状態で、ローカルまたはリモート コンピューター上で実行中のアプリをデバッグすること、複数のプロセスを同時にデバッグすること、Visual Studio で作成されていないアプリをデバッグすること、Visual Studio から起動しなかった任意のアプリをデバッグすることができます。 たとえば、デバッガーを使用せずにアプリを実行しているときに例外が発生した場合は、アプリを実行しているプロセスにデバッガーをアタッチして、デバッグを開始することができます。

ヒント

実際のデバッグ シナリオに [プロセスにアタッチ] を使用すべきかどうかわからない場合は、 「一般的なデバッグ シナリオ」を参照してください。

ローカル コンピューターで実行中のプロセスにアタッチする

以前にアタッチしたプロセスにすばやく再アタッチするには、「プロセスに再アタッチする」を参照してください。

ローカル コンピューター上のプロセスにアタッチするには:

  1. Visual Studio で [デバッグ]>[プロセスにアタッチ] を選択し (または Ctrl+Alt+P キーを押し)、[プロセスにアタッチ] ダイアログ ボックスを開きます。

  2. [接続の種類] を確認します。

    ほとんどの場合、[既定] を使用することができます。 シナリオによっては、異なる種類の接続が必要になる場合があります。 詳細については、この記事の他のセクション、または「一般的なデバッグ シナリオ」を参照してください。

  3. [接続先] をローカル コンピューター名に設定します。

    [プロセスにアタッチ] ダイアログ ボックスのスクリーンショット。接続ターゲットがローカル コンピューター名に設定されています。

    [プロセスにアタッチ] ダイアログ ボックスのスクリーンショット。接続ターゲットがローカル コンピューター名に設定されています。

  4. [使用可能なプロセス] リストで、アタッチする 1 つまたは複数のプロセスを見つけて選択します。

    • プロセスをすばやく選択するには、[プロセスをフィルター] ボックスに名前または最初の文字を入力します。

    • プロセス名がわからない場合は、一覧を参照してください。または、一般的なプロセス名の場合は「一般的なデバッグ シナリオ」を参照してください。

    ヒント

    [プロセスにアタッチ] ダイアログ ボックスが開いている間にバックグラウンドでプロセスが開始および停止される可能性があるため、実行中のプロセス リストが常に最新であるとは限りません。 いつでも [更新] を選択して、最新のリストを表示することができます。

  5. [アタッチ先] フィールドに、デバッグする予定のコードの種類が一覧表示されていることを確認します。 既定の [自動] 設定は、ほとんどの種類のアプリで機能します。

    [既定] の接続の種類を使用している場合は、アタッチするコードの種類を手動で選択できます。 それ以外の場合は、[選択] オプションが無効になる可能性があります。

    手動でコードの種類を選択するには:

    1. 選択 をクリックします。
    2. [コードの種類の選択] ダイアログボックスで、[次のコードの種類をデバッグする] を選択します。 リスト内のプロセスにアタッチしようとしたときにエラーが発生した場合は、[コードの種類の選択] ダイアログ ボックスを使用して、問題のトラブルシューティングを行うことができます。
    3. デバッグするコードの種類を選択します。
    4. [OK] を選択します。
  6. 添付を選択します。

ヒント

同じプロセスが複数あるシナリオでは、[コマンド ライン] 列、または [タイトル] 列の w3wp プロセスの詳細を使用して、適切なプロセスを特定します。

Note

デバッグ用に複数のアプリにアタッチすることはできますが、デバッガーでアクティブになるアプリは一度に 1 つだけです。 アクティブなアプリは、Visual Studio の [デバッグの場所] ツールバーまたは [プロセス] ウィンドウで設定できます。

リモート コンピューター上のプロセスにアタッチする

[プロセスにアタッチ] ダイアログボックスでリモート コンピューターを選択し、そのコンピューター上で実行されている使用可能なプロセス リストを表示して、デバッグ用に 1 つ以上のプロセスにアタッチすることもできます。 リモート デバッガー (msvsmon.exe) がリモート コンピューター上で実行されている必要があります。 詳細については、「リモート デバッグ」を参照してください。

IIS に配置されている ASP.NET アプリケーションをデバッグする場合の詳細な手順については、リモート IIS コンピューター上の ASP.NET のリモート デバッグに関するページを参照してください。

リモート コンピューター上で実行中のプロセスにアタッチするには:

  1. Visual Studio で [デバッグ]>[プロセスにアタッチ] を選択し (または Ctrl+Alt+P キーを押し)、[プロセスにアタッチ] ダイアログ ボックスを開きます。

  2. [接続の種類] を確認します。

    ほとんどの場合、[既定] を使用することができます。 Linux やコンテナー化されたアプリのデバッグなど、一部のシナリオでは、別の接続の種類が必要です。 詳細については、この記事の他のセクション、または「一般的なデバッグ シナリオ」を参照してください。

  3. [接続先] ボックスで、次のいずれかの方法を使用してリモート コンピューターを選択します。

    • [接続先] の横にあるドロップダウン リストの矢印を選択し、ドロップダウン リストからコンピューター名を選択します。

    • [接続先] ボックスにコンピューター名を入力し、Enter キーを押します。

      Visual Studio で必要なポートがコンピューター名に追加されていることを確認します (<リモート コンピューター名>:port という形式で表示されます)。

      Note

      リモート コンピューター名を使用して接続できない場合は、IP とポート アドレス (123.45.678.9:4022 など) を使用してみてください。 4026 は、Visual Studio 2022 リモート デバッガーの既定のポートです。 その他のリモート デバッガーポートの割り当てについては、「リモート デバッガーのポートの割り当て」を参照してください。

      Note

      リモート コンピューター名を使用して接続できない場合は、IP とポート アドレス (123.45.678.9:4022 など) を使用してみてください。 4024 は、Visual Studio 2019 リモート デバッガーの既定のポートです。 その他のリモート デバッガーポートの割り当てについては、「リモート デバッガーのポートの割り当て」を参照してください。

    • [接続先] ボックスの横にある [検索] ボタンを選択し、[リモート接続] ダイアログボックスを開きます。 [リモート接続] ダイアログ ボックスには、ローカル サブネット上にあるか、コンピューターに直接接続されているすべてのデバイスが一覧表示されます。 リモート デバイスを検出するには、場合によってはサーバー上の UDP ポート 3702 を開く必要があります。 目的のコンピューターまたはデバイスを選択し、[選択] をクリックします。

    Note

    [接続の種類] はデバッグ セッション間で保持されます。 [接続先] 設定は、そのターゲットでデバッグ接続が正常に行われた場合にのみ、デバッグ セッション間で保持されます。

  4. [更新] をクリックして [使用可能なプロセス] リストを設定します。

    ヒント

    [プロセスにアタッチ] ダイアログ ボックスが開いている間にバックグラウンドでプロセスが開始および停止される可能性があるため、実行中のプロセス リストが常に最新であるとは限りません。 いつでも [更新] を選択して、最新のリストを表示することができます。

  5. [使用可能なプロセス] リストで、アタッチする 1 つまたは複数のプロセスを見つけて選択します。

  6. [アタッチ先] フィールドに、デバッグする予定のコードの種類が一覧表示されていることを確認します。 既定の [自動] 設定は、ほとんどの種類のアプリで機能します。

    [既定] の接続の種類を使用している場合は、アタッチするコードの種類を手動で選択できます。 そうでない場合は、[選択] オプションが無効になる可能性があります。

    手動でコードの種類を選択するには:

    1. 選択 をクリックします。
    2. [コードの種類の選択] ダイアログボックスで、[次のコードの種類をデバッグする] を選択します。 リスト内のプロセスにアタッチしようとしたときにエラーが発生した場合は、[コードの種類の選択] ダイアログ ボックスを使用して、問題のトラブルシューティングを行うことができます。
    3. [OK] を選択します。
  7. [接続] を選択します。

Note

デバッグ用に複数のアプリにアタッチすることはできますが、デバッガーでアクティブになるアプリは一度に 1 つだけです。 アクティブなアプリは、Visual Studio の [デバッグの場所] ツールバーまたは [プロセス] ウィンドウで設定できます。

リモート デスクトップ (ターミナル サービス) セッションでのデバッグ時には、[使用可能なプロセス] リストにすべての使用可能なプロセスが表示されない場合があります。 制限されたユーザー アカウントを持つユーザーとして Visual Studio を実行している場合、[使用可能なプロセス] リストには、セッション 0 で実行されているプロセスは表示されません。 セッション 0 は、サービスや w3wp.exe などのその他のサーバー プロセスに使用されます。 この問題を解決するには、管理者アカウントで Visual Studio を実行するか、ターミナル サービス セッションではなくサーバー コンソールから Visual Studio を実行します。

どちらの方法も実行できない場合、3 つ目の方法として、Windows コマンド ラインから vsjitdebugger.exe -p <ProcessId> を実行することによって、プロセスにアタッチできます。 プロセス ID は tlist.exe を使用して確認できます。 tlist.exe を入手するには、WDK と WinDbg のダウンロードに関するページで Windows 用のデバッグ ツールをダウンロードし、インストールします。

Azure App Service (Windows) 上で実行されている .NET Core プロセスに添付する

Azure App Service (Windows) に発行する場合の手順については、Azure での ASP.NET Core のリモート デバッグに関する記事、または「Azure App Service のデバッグ」を参照してください。

Azure App Service (Windows) 上で実行されている .NET Core プロセスに添付する

Azure App Service (Windows) に発行する場合は、発行プロファイルの [ホスティング] の下の [...] メニューの下に、[デバッガーを添付する] オプションがあります。 Visual Studio は、プロファイルの発行対象である Azure App Service (Windows) のインスタンスにリモート デバッガーを添付しようと試みます。

[発行の概要] ページ内の [デバッガーを添付する] オプションのスクリーンショット。

SSH を使用して Linux 上で実行されている .NET Core プロセスにアタッチする

詳細については、Linux 上で実行されている .NET Core の SSH を使用したリモート デバッグに関するページを参照してください。

Docker コンテナー上で実行されているプロセスにアタッチする

Visual Studio 2019 以降では、Docker コンテナー上で実行されているプロセスに Visual Studio デバッガーをアタッチできます。 Linux .NET Core Docker コンテナーの場合は、「Linux Docker コンテナー上で実行されているプロセスにアタッチする」を参照してください。 Windows Docker コンテナーの場合は、「Windows Docker コンテナー上で実行されているプロセスにアタッチする」を参照してください。

プロセスに再アタッチする

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

Note

[プロセスに再アタッチする] コマンドは、Visual Studio 2017 以降で使用できます。

一般的なデバッグ シナリオ

[プロセスにアタッチ] を使用するかどうか、どのプロセスにアタッチするかを判断できるように、いくつかの一般的なデバッグ シナリオと、使用可能なその他の手順のリンクを次の表に示します (このリストはすべてを網羅しているわけではありません)。

ユニバーサル Windows プラットフォーム (UWP) アプリなどの一部のアプリの種類では、プロセス名に直接アタッチせず、代わりに Visual Studio の [インストールされているアプリ パッケージのデバッグ] メニュー オプションを使用します (表を参照してください)。

C++ で記述されたコードにデバッガーをアタッチするには、コードが DebuggableAttributeを生成する必要があります。 /ASSEMBLYDEBUG リンカー オプションを使ってリンクすると、これを自動的にコードに追加できます。

クライアント側スクリプトのデバッグでは、ブラウザーでスクリプトのデバッグを有効にする必要があります。 Chrome 上でクライアント側のスクリプトをデバッグするには、コードの種類として [JavaScript] または [TypeScript] を選択します。アプリの種類によっては、すべての Chrome インスタンスを閉じ、ブラウザーをデバッグ モードで起動する必要があります (コマンド ラインから「chrome.exe --remote-debugging-port=9222」と入力します)。

クライアント側スクリプトのデバッグでは、ブラウザーでスクリプトのデバッグを有効にする必要があります。 Chrome 上でクライアント側スクリプトをデバッグするには、コードの種類として [JavaScript (Chrome)] または [JavaScript (Microsoft Edge - Chromium)] を選択します。アプリの種類によっては、すべての Chrome インスタンスを閉じ、ブラウザーをデバッグ モードで起動する必要があります (コマンド ラインから「chrome.exe --remote-debugging-port=9222」と入力します)。 以前のバージョンの Visual Studio では、Chrome のスクリプト デバッガーは Web kit でした。

アタッチする実行中のプロセスをすばやく選択するには、Visual Studio で Ctrl+Alt+P キーを押し、プロセス名の最初の文字を入力します。

シナリオ デバッグ方法 プロセス名 メモとリンク
ASP.NET Core - IIS サーバーでのリモート デバッグ リモート ツールと [プロセスにアタッチ] を使用する w3wp.exe または dotnet.exe .NET Core 3 以降では、w3wp.exe プロセスは、既定のアプリ内ホスティング モデルに使用されます。 アプリの配置については、IIS への発行に関するページを参照してください。 詳細については、リモートの IIS コンピューター上の ASP.NET Core のリモート デバッグに関するページを参照してください。
ASP.NET Core - デバッガーを使用せずにアプリを起動した後、ローカル コンピューター上でデバッグする [プロセスにアタッチ] を使用する msedge.exe これは、(たとえば) プロファイリング時など、アプリの読み込みを高速化するために役立つことがあります。
ASP.NET 4 または 4.5 - IIS サーバー上でのリモート デバッグ リモート ツールと [プロセスにアタッチ] を使用する w3wp.exe リモート IIS コンピューター上の ASP.NET のリモート デバッグに関するページを参照してください
クライアント側スクリプト - サポートされているアプリの種類について、ローカル IIS サーバー上でデバッグする [プロセスにアタッチ] を使用する chrome.exe または msedge.exe スクリプトのデバッグを有効にする必要があります。 Chrome の場合、Chrome をデバッグ モードで実行し (コマンド ラインから「chrome.exe --remote-debugging-port=9222」と入力します)、[アタッチ先] フィールドで JavaScript または TypeScript を選択する必要もあります。
C#、Visual Basic、または C++ アプリ - ローカル コンピューター上でデバッグする 標準のデバッグ (F5 キー) または [プロセスにアタッチ] を使用する <アプリ名>.exe ほとんどのシナリオでは、[プロセスにアタッチ] ではなく、標準のデバッグを使用します。
Windows デスクトップ アプリ - リモート デバッグ リモート ツール 該当なし C# または Visual Basic アプリのリモート デバッグまたは C++ アプリのリモート デバッグに関するページを参照してください
Linux 上の .NET Core - デバッグ [プロセスにアタッチ] を使用する dotnet.exe または一意のプロセス名 SSH を使用するには、Linux 上で実行されている .NET Core の SSH を使用したリモート デバッグに関するページを参照してください。 コンテナー化されたアプリについては、Docker コンテナーで実行されているプロセスへのアタッチに関連する記事を参照してください。
コンテナー化されたアプリ - デバッグ [プロセスにアタッチ] を使用する dotnet.exe または一意のプロセス名 Docker コンテナーで実行されているプロセスへのアタッチに関する記事を参照
Linux 上の Python - リモート デバッグ [プロセスにアタッチ] を使用する debugpy Python Tools からリモートでアタッチする」を参照してください
サポートされている他の種類のアプリ - サーバー プロセスでのデバッグ サーバーがリモートの場合は、リモート ツールを使用し、[プロセスにアタッチ] を行います chrome.exemsedge.exe、またはその他のプロセス 必要に応じて、リソース モニターを使用してプロセスを特定します。 「Remote debugging」(リモート デバッグ) を参照してください。
ユニバーサル Windows アプリ (UWP)、OneCore、HoloLens、または IoT アプリ - リモート デバッグ インストールされているアプリ パッケージのデバッグ 該当なし [プロセスにアタッチ] を使用するのではなく、「インストールされているアプリケーション パッケージをデバッグする」を参照してください。
ユニバーサル Windows アプリ (UWP)、OneCore、HoloLens、または IoT - Visual Studio から起動しなかったアプリをデバッグする インストールされているアプリ パッケージのデバッグ 該当なし [プロセスにアタッチ] を使用するのではなく、「インストールされているアプリケーション パッケージをデバッグする」を参照してください。

デバッガーの機能を使用する

プロセスにアタッチするときに Visual Studio デバッガーの全機能 (ブレークポイントのヒットなど) を使用するには、アプリがローカル ソースとシンボルに完全に一致する必要があります。 つまり、デバッガーで正しいシンボル (.pdb) ファイルを読み込むことができる必要があります。 既定では、これにはデバッグ ビルドが必要です。

リモート デバッグのシナリオでは、Visual Studio でソース コード (またはソース コードのコピー) を開いておく必要があります。 リモート マシンでコンパイルされたアプリ バイナリは、ローカル コンピューター上と同じビルドのものである必要があります。

一部のローカル デバッグ シナリオでは、アプリに正しいシンボル ファイルが存在する場合、Visual Studio でソースにアクセスせずにデバッグできます。 既定では、これにはデバッグ ビルドが必要です。 詳細については、シンボル ファイルとソース ファイルの指定に関するページを参照してください。

アタッチ エラーをトラブルシューティングする

場合によっては、デバッグするコードの種類を正しく識別するためにデバッガーに手助けが必要になることがあります。 接続値が適切に設定されているものの ([使用可能なプロセス] リストで正しいプロセスを確認できます)、デバッガーのアタッチに失敗した場合は、[接続の種類] リストで最も適切な接続の種類を選択します。これは、たとえば Linux または Python アプリをデバッグする場合に必要になることがあります。 既定の接続の種類を使用している場合は、このセクションで後ほど説明するように、接続する特定の種類のコードを選択することもできます。

実行中のプロセスにデバッガーがアタッチすると、このプロセスは、1 種類以上のコードを含むことができます。 デバッガーをアタッチできるコードの種類は [コードの種類の選択] ダイアログ ボックスで表示されて選択されています。

デバッガーは、ある種類のコードに正常にアタッチできても、別の種類にはアタッチできないことがあります。 通常、これは次の場合に発生します。

  • リモート コンピューター上で動作しているプロセスにアタッチしようとしている。 リモート コンピューターには、一部の種類のコードにしか対応しないリモート デバッグ コンポーネントがインストールされている場合があるためです。
  • ダイレクト データベース デバッグのために複数のプロセスにアタッチしようとしている。 SQL デバッグ機能は、単一プロセスへのアタッチのみをサポートします。

デバッガーが一部の種類のコードにしかアタッチできない場合は、アタッチできなかった種類を識別するメッセージが表示されます。

デバッガーが少なくとも 1 種類のコードに正常にアタッチできる場合は、プロセスのデバッグを開始できます。 正常にアタッチされたコードの種類のみをデバッグできます。 プロセス内のアタッチされていないコードは引き続き実行されますが、そのコードに対するブレークポイントの設定、データの表示、その他のデバッグ操作を実行することはできません。

デバッガーがコードの種類へのアタッチに失敗した理由についてより詳しい情報が必要な場合は、該当するコードの種類のみに再アタッチを試してください。

ある種類のコードへのアタッチに失敗した理由を確認するには

  1. プロセスからデタッチします。 [デバッグ] メニューで [すべてデタッチ] を選択します。

  2. プロセスに再アタッチし、アタッチに失敗したコードの種類のみを選択します。

    1. [プロセスにアタッチ] ダイアログ ボックスの [選択可能なプロセス] の一覧で、プロセスを選択します。

    2. 選択 を選択します。

    3. [コードの種類の選択] ダイアログ ボックスの [次のコードの種類をデバッグする] をクリックし、アタッチに失敗したコードの種類を選択します。 他のコードの種類の選択を解除します。

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

    5. [プロセスにアタッチ] ダイアログ ボックスで、[アタッチ] を選択します。

    このとき、アタッチは完全に失敗し、詳細なエラー メッセージが表示されます。