方法: Windows サービス アプリケーションをデバッグする
Note
この記事は、.NET のホステッド サービスには当てはまりません。 Microsoft.Extensions.Hosting.BackgroundService を使用する Windows サービスと Worker サービス テンプレートの最新のコンテンツについては、以下を参照してください。
サービスは、Visual Studio 内からではなく、サービス コントロール マネージャーのコンテキスト内から実行する必要があります。 そのため、サービスのデバッグは、その他の種類の Visual Studio アプリケーションをデバッグするように単純ではありません。 サービスのデバッグを行うには、サービスを起動してから、サービスを実行しているプロセスにデバッガーをアタッチします。 これにより、Visual Studio のすべての標準デバッグ機能を使用して、アプリケーションをデバッグできるようになります。
注意事項
プロセスが強制終了される可能性もあるため、アタッチするプロセスの特性や、アタッチによる影響をよく理解している場合に限って、プロセスにデバッガーをアタッチしてください。 たとえば、システムは WinLogon プロセスがないと動作しないため、WinLogon プロセスにデバッガーをアタッチした後でデバッグを中止すると、システムは停止します。
デバッガーをアタッチできるのは、実行中のサービスだけです。 アタッチのプロセスは、サービスが現在実行している処理に割り込みます。実際にサービスの処理の停止や一時停止を行うのではありません。 つまり、実行中のサービスに対してデバッグを開始すると、デバッグの間、サービスは技術的には起動状態のままですが、処理は中断されます。
プロセスにデバッガーをアタッチした後で、ブレークポイントを設定し、設定したブレークポイントを使用してコードをデバッグできます。 プロセスへのアタッチに使用するダイアログ ボックスを閉じると、デバッグ モードが有効になります。 サービス コントロール マネージャーを使用して、サービスの開始、停止、一時停止、および再開を行うことができます。これによって、設定したブレークポイントにヒットします。 デバッグが正常に完了したら、このダミー サービスを削除できます。
この記事ではローカル コンピューターで実行されているサービスのデバッグについて説明しますが、リモート コンピューターで実行されている Windows サービスをデバッグすることもできます。 「リモート デバッグ」をご覧ください。
Note
サービス コントロール マネージャーではすべてのサービスの開始試行に対して 30 秒の制限が適用されるため、OnStart メソッドのデバッグが困難になる場合があります。 詳細については、トラブルシューティング:Windows サービスのデバッグに関するページをご覧ください。
警告
デバッグに有用な情報を取得するためには、Visual Studio デバッガーは、デバッグ対象のバイナリのシンボル ファイルを検索する必要があります。 Visual Studio に組み込まれているサービスをデバッグしている場合は、シンボル ファイル (.pdb ファイル) は実行可能ファイルまたはライブラリと同じフォルダーにあり、デバッガーはそれらを自動的に読み込みます。 構築していないサービスをデバッグしている場合は、最初にサービスのシンボルを検索し、デバッガーでこれらを検出できるようにする必要があります。 「Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger (Visual Studio デバッガーでシンボル ファイル (.pdb) とソース ファイルを指定する)」をご覧ください。 システム プロセスをデバッグしているか、サービスにシステム呼び出しのシンボルを含めたい場合は、Microsoft シンボル サーバーを追加する必要があります。 シンボルによるデバッグに関する記事をご覧ください。
サービスをデバッグするには
サービスをデバッグ構成で構築します。
サービスをインストールします。 詳細については、サービスをインストールおよびアンインストールする」を参照してください。
サービス コントロール マネージャー、サーバー エクスプローラー、またはコードで、サービスを起動します。 詳細については、サービスを開始する」を参照してください。
システム プロセスにアタッチすることができるように、管理者資格情報を使用して Visual Studio を起動します。
(省略可能) Visual Studio のメニュー バーで [ツール] 、 [オプション] の順に選択します。 [オプション] ダイアログ ボックスで、 [デバッグ] 、 [シンボル] の順に選択し、 [Microsoft シンボル サーバー] チェック ボックスをオンにし、 [OK] を選択します。
メニュー バーの [デバッグ] または [ツール] メニューで、 [プロセスにアタッチ] を選択します。 (キーボード:Ctrl + Alt + P)
[プロセス] ダイアログ ボックスが表示されます。
[全ユーザーのプロセスを表示する] チェック ボックスをオンにします。
[選択可能なプロセス] セクションでサービスのプロセスを選択し、 [アタッチ] を選択します。
ヒント
プロセスの名前は、サービスの実行可能ファイルの名前と同じになります。
[プロセスにアタッチ] ダイアログ ボックスが表示されます。
適切なオプションを選択し、 [OK] を選択してダイアログ ボックスを閉じます。
Note
デバッグ モードになります。
コード内で使用する任意のブレークポイントを設定します。
サービス コントロール マネージャーを起動し、停止、一時停止、再開の各コマンドを送信してサービスを操作して、ブレークポイントをヒットします。 サービス コントロール マネージャーの実行方法の詳細については、「方法:サービスを開始する」を参照してください。 トラブルシューティング:Windows サービスのデバッグに関するページもご覧ください。
Windows サービスのデバッグのヒント
サービスのプロセスにアタッチすると、そのサービスのコードのほとんど (すべてではない) をデバッグすることができます。 たとえば、サービスが既に開始されているため、そのサービスの OnStart メソッド内のコード、またはサービスをこの方法で読み込むために使用されている Main
メソッド内のコードは、デバッグすることができません。 この制限に対処する方法の 1 つは、デバッグ専用の一時的な "ダミー" サービスを作成し、サービス アプリケーションに追加することです。 サービスを両方ともインストールし、ダミー サービスを開始してサービス プロセスを読み込むことができます。 "ダミー" サービスがプロセスを起動した後は、Visual Studio の [デバッグ] メニューで、サービス プロセスへのアタッチを行うことができます。
Sleep メソッドに呼び出しを追加して、プロセスにアタッチできるようになるまで動作を遅延します。
プログラムを通常のコンソール アプリケーションに変更します。 このためには、起動方法に応じて Windows サービスとコンソール アプリケーションの両方として実行することができるように、Main
メソッドを次のように書き換えます。
方法: Windows サービスをコンソール アプリケーションとして実行する
OnStart メソッドと OnStop メソッドを実行するサービスにメソッドを追加します。
internal void TestStartupAndStop(string[] args) { this.OnStart(args); Console.ReadLine(); this.OnStop(); }
Main
メソッドを次のように書き換えます。static void Main(string[] args) { if (Environment.UserInteractive) { MyNewService service1 = new MyNewService(args); service1.TestStartupAndStop(args); } else { // Put the body of your old Main method here. } }
プロジェクトのプロパティの [アプリケーション] タブで、 [出力の種類] を [コンソール アプリケーション] に設定します。
[デバッグの開始] を選択します (F5)。
プログラムを再度 Windows サービスとして実行するには、プログラムをインストールして、Windows サービスとして通常どおり起動します。 これらの変更を反対にする必要はありません。
システムの起動時にのみ発生する問題をデバッグするときなどのいくつかのケースでは、Windows デバッガーを使用する必要があります。 Windows Driver Kit (WDK) をダウンロードし、「Windows サービスをデバッグする方法」をご覧ください。
関連項目
.NET