実行中のプロセスへのアタッチ
このトピックでは、実行中のプロセスへのアタッチ、リモート コンピューター上のプロセスへのアタッチ、およびアタッチ エラーのトラブルシューティングの方法を示します。
デバッガーをプロセスにアタッチする理由
Visual Studio デバッガーには、Visual Studio の外部で実行中のプロセスにアタッチできる機能があります。このアタッチ機能を使用すると、以下の操作を実行できます。
Visual Studio で作成されたものではないアプリケーションをデバッグできます。
複数のプロセスを同時にデバッグできます。単一のソリューションに含まれる複数のプロジェクトを起動して、複数のプロセスをデバッグすることもできます。
リモート コンピューターで実行中のプロセスをデバッグできます。
Visual Studio では簡単に起動できない別のプロセスで実行している DLL をデバッグできます。たとえば、インターネット インフォメーション サービスで実行しているサービスや ISAPI DLL をデバッグします。
プロセスが Visual Studio の外部で動作しているときにクラッシュした場合、デバッガーを自動的に起動できます。これは Just-In-Time デバッグです。
プログラムのアタッチが完了すると、デバッガーの実行コマンドを使用したり、プログラムの状態をチェックしたりできます。詳細については、「Visual Studio での 1 つ以上のプロセスのデバッグ」、「Visual Studio Debugger の開始、中断、ナビゲート、および停止」、および「デバッガーでのデータ表示」を参照してください。プログラムのチェック機能は、デバッグ情報付きでビルドされたプログラムかどうか、プログラムのソース コードにアクセスできるかどうか、および共通言語ランタイムの JIT コンパイラがデバッグ情報を追跡しているかどうかによって限定されます。
C++ メモ |
---|
C++ で記述されたコードにデバッガーをアタッチするには、コードが DebuggableAttribute を生成する必要があります。/ASSEMBLYDEBUG リンカー オプションを使ってリンクすると、これを自動的にコードに追加できます。 |
注意 |
---|
JavaScript で記述された Windows ストア アプリにアタッチするには、まずそのアプリに対してデバッグを有効にする必要があります。Windows デベロッパー センター内の「Attach the debugger」を参照してください。 |
実行中のプロセスにアタッチする
[デバッグ] メニューの [プロセスにアタッチ] をクリックします
[プロセスにアタッチ] ダイアログ ボックスの [選択可能なプロセス] ボックスの一覧で、アタッチするプログラムを探します。
デバッグするプログラムが別のコンピューターで実行中の場合は、[修飾子] ボックスの一覧でリモート コンピューターを選択または指定します。詳細については、「リモート デバッグと診断」を参照してください。
プロセスが別のユーザー アカウントで実行されている場合は、[すべてのユーザーからのプロセスを表示する] チェック ボックスをオンにします。
リモート デスクトップ接続経由で接続している場合は、[すべてのセッションのプロセスを表示する] チェック ボックスをオンにします。
[アタッチ先] ボックスに、デバッグするコードの種類が表示されていることを確認します。既定の [自動] 設定では、デバッグするコードの種類が自動的に判断されます。自動による設定が適切でなかった場合は
[選択] をクリックします。
[コードの種類の選択] ダイアログ ボックスで、[次のコードの種類をデバッグする] をクリックし、デバッグする種類を選択します。
[OK] をクリックします。
[アタッチ] をクリックします。
[プロセス] ダイアログ ボックスを開くと、[選択可能なプロセス] ボックスが自動的に表示されます。このダイアログ ボックスが開いている間に、プロセスをバックグラウンドで開始および停止できます。このため、内容が常に最新であるとは限りません。[更新] をクリックすると、いつでも一覧の内容を更新して、現在のプロセス一覧を確認できます。
デバッグ中には複数のプログラムにアタッチできますが、デバッガーでアクティブになっているプログラムは常に 1 つだけです。アクティブなプログラムは、[デバッグの場所] ツール バーまたは [プロセス] ウィンドウで設定できます。
[!メモ]
C++/CLI で記述されたマネージ コードにデバッガーをアタッチするには、コードが DebuggableAttribute を生成する必要があります。/ASSEMBLYDEBUG リンカー オプションを使ってリンクすると、これを自動的にコードに追加できます。
信頼関係のないユーザー アカウントによって所有されているプロセスにアタッチしようとすると、セキュリティ警告の確認ダイアログ ボックスが表示されます。詳細については、「セキュリティ警告: 信頼されていないユーザーが所有するプロセスにアタッチするには危険が伴います。以下の情報に関して疑わしい点がある場合や、不明な場合は、このプロセスにアタッチしないでください。」を参照してください。
リモート デスクトップ (ターミナル サービス) セッションでのデバッグ時には、[選択可能なプロセス] ボックスに、使用可能なプロセスのすべてが表示されない場合があります。Windows Server 2003 以降のバージョンでは、Visual Studio を制限付きユーザーとして実行している場合、[選択可能なプロセス] ボックスの一覧には、セッション 0 で実行しているプロセスは表示されません。セッション 0 は、サービスおよび w3wp.exe を含むその他のサーバー プロセス用に使用されます。この問題を解決するには、管理者アカウントで Visual Studio を実行するか、ターミナル サービス セッションの代わりにサーバー コンソールから Visual Studio を実行します。どちらの方法も実行できない場合、3 つ目の方法として、Windows コマンド ラインから vsjitdebugger.exe -pProcessId を実行することによって、プロセスにアタッチできます。プロセス ID は tlist.exe を使用して確認できます。tlist.exe を入手するには、https://go.microsoft.com/fwlink/?LinkId=168279 で Windows 対応のデバッグ ツールをダウンロードし、インストールします。
アタッチしたプロセスのデバッグを停止するには、[デバッグ] / [デバッグの停止] をクリックするか、またはアタッチしたプロセスの実行を停止します。
リモート コンピューター上のプロセスにアタッチする
[プロセスにアタッチ] ダイアログ ボックスでは、リモート デバッグ用にセットアップした他のコンピューターを選択できます。詳細については、「デバイスのリモート ツールのセットアップ」を参照してください。リモート コンピューターを選択すると、そのコンピューターで実行されている選択可能なプロセスの一覧を表示して、1 つ以上のプロセスにアタッチしてデバッグを実行できます。
リモート コンピューターを選択するには:
[プロセスにアタッチ] ダイアログ ボックスの [トランスポート] ボックスの一覧で、該当する接続の種類を選択します。[既定値] は、ほとんどの場合に適切な設定です。
[修飾子] ボックスの一覧でリモート コンピューター名を選択します。以下のいずれかの方法を使用します。
[修飾子] ボックスの一覧に名前を入力します。
[修飾子] ボックスの一覧の横のドロップダウン矢印をクリックし、一覧でコンピューター名を選択します。
[修飾子] ボックスの一覧の横にある [検索] ボタンをクリックして、[リモート デバッガー接続の選択] ダイアログ ボックスを開きます。[リモート デバッガー接続の選択] ダイアログ ボックスには、ローカル サブネット上にあるデバイスと、イーサネット ケーブルで自分のコンピューターに直接接続されているデバイスがすべて表示されます。目的のコンピューターまたはデバイスをクリックし、[選択] をクリックします。
[トランスポート] の設定は、デバッグ セッション間で保持されます。[修飾子] の設定は、その修飾子でデバッグ接続が成功した場合のみ、デバッグ セッション間で保持されます。
アタッチ エラーをトラブルシューティングする
実行中のプロセスにデバッガーがアタッチすると、このプロセスは 1 種類以上のコードを含むことができます。デバッガーをアタッチできるコードの種類は [コードの種類の選択] ダイアログ ボックスで表示されて選択されています。
[!メモ]
C++ で記述されたマネージ コードにデバッガーをアタッチするには、コードが DebuggableAttribute を生成する必要があります。/ASSEMBLYDEBUG リンカー オプションを使ってリンクすると、これを自動的にコードに追加できます。
注意 |
---|
JavaScript で記述された Windows ストア アプリにアタッチするには、まずそのアプリに対してデバッグを有効にする必要があります。Windows デベロッパー センター内の「Attach the debugger」を参照してください。 |
デバッガーは、ある種類のコードに正常にアタッチできても、別の種類にはアタッチできないことがあります。この問題は、リモート コンピューターで動作しているプロセスにアタッチしようとする場合に発生することがあります。リモート コンピューターには、一部の種類のコードにしか対応しないリモート デバッグ コンポーネントがインストールされている場合があるためです。また、ダイレクト データベース デバッグのために複数のプロセスにアタッチしようとした場合にも発生することがあります。SQL デバッグ機能は、単一プロセスへのアタッチのみをサポートします。
デバッガーが一部の種類のコードにしかアタッチできない場合は、アタッチできなかった種類を識別するメッセージが表示されます。
デバッガーが少なくとも 1 種類のコードに正常にアタッチできる場合は、プロセスのデバッグを開始できます。正常にアタッチされたコードの種類のみをデバッグできます。上記のメッセージの例は、種類がスクリプトのコードにアタッチできなかったことを示しています。この場合、プロセス内でスクリプト コードをデバッグできません。プロセス内のスクリプト コードはそのまま実行されますが、スクリプトでのブレークポイントの設定、データの表示、またはその他のデバッグ操作は実行できません。
デバッガーがコードの種類へのアタッチに失敗した理由についてより詳しい情報が必要な場合は、該当するコードの種類のみに再アタッチを試行できます。
ある種類のコードへのアタッチに失敗した理由を確認するには
プロセスからデタッチします。[デバッグ] メニューの [すべてデタッチ] をクリックします。
コードの種類を 1 つだけ選択して、プロセスに再度アタッチします。
[プロセスにアタッチ] ダイアログ ボックスの [選択可能なプロセス] ボックスの一覧で、プロセスを選択します。
[選択] をクリックします。
[コードの種類の選択] ダイアログ ボックスの [次のコードの種類をデバッグする] をクリックし、アタッチに失敗したコードの種類を選択します。他のコードをすべてオフにします。
[OK] をクリックします。[コードの種類の選択] ダイアログ ボックスが閉じます。
[プロセスにアタッチ] ダイアログ ボックスで、[アタッチ] をクリックします。
このとき、アタッチは完全に失敗し、詳細なエラー メッセージが表示されます。
参照
概念
Visual Studio での 1 つ以上のプロセスのデバッグ
Just-In-Time Debugging in Visual Studio (Visual Studio での Just-In-Time デバッグ)