こんにちは。決済システムでエンジニアをやっております hoshino33 です。
今回はWindows サービスのデバッグ方法について紹介したいと思います。
はじめに
決済システムでは一部の機能でWindows サービスを利用しており、デバッグするには一癖あったため方法を記載しようと思います。
デバッグするまで
Windows サービスをデバッグを行うには、サービスを起動してから、サービスを実行しているプロセスにデバッガーをアタッチする必要があります。今回はこれらをPowerShellを利用した手順になります。
デバッグ方法
①デバッグ対象のサービスを作成
今回は「WindowsService1」というWindows サービスを空で作成してこちらに対してデバッグを行いたいと思います。 また、以降のコマンドは画像内の「開発者用PowerShell」から実行しております。
②サービスを登録する
デバッグするためにはサービスを実行する必要があるため登録します。
# Nameには登録する名前を指定 # BinaryPathNameには実行ファイルを指定 New-Service -Name "WindowsService1" -BinaryPathName C:\Sample\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe
③サービスを開始する
デバッグするためにサービスを実行します。
# Nameには登録した際の名前を指定 Start-Service -Name "WindowsService1"
④プロセスにアタッチします
以下からプロセスにアタッチを行えばデバッグ可能です。
Visual Studio > デバッグ > プロセスにアタッチ
⑤サービスを停止する(必要に応じて)
デバッグが完了後にサービスを停止しておきます。
Stop-Service -Name "WindowsService1"
⑥登録したサービスを削除する(必要に応じて)
デバッグが完了後にサービスを削除しておきます。
# PowerShell 6以上の場合 Remove-Service -Name "WindowsService1" # PowerShell 5以下の場合 $service = Get-WmiObject -Class Win32_Service -Filter "Name='WindowsService1'" $service.delete()
毎回プロセスにアタッチするのが面倒
サービス開始時にプロセスにアタッチするのが面倒なら以下を仕込んでおけばサービス開始時に自動的にアタッチされます。
※プロダクトのコードに含まれないように、リリース時は削除するか、本番環境では実行されないようにしてください。
// サービス開始時に自動的にプロセスにアタッチされます System.Diagnostics.Debugger.Launch();
サービスを開始すると以下が表示されるのでデバッグしますを選ぶ。
まとめ
Windows サービスを扱うことがあまりなかったので、同じようにWindows サービスを扱っている際にデバッグの参考になれば幸いです。また、上記のコマンドを組み合わせてスクリプト化すればワンタッチでデバッグできそうです。
We are hiring!!
ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!
speakerdeck.com
www.robotpayment.co.jp