由於服務必須從服務控制管理器的上下文中運行,而不是從 Visual Studio 中運行,因此調試服務不像調試其他 Visual Studio 應用程序類型那樣簡單。若要調試服務,必須首先啓動服務,然後將一個調試器附加到正在運行服務的進程中。然後可以使用 Visual Studio 的所有標準調試功能來調試應用程序。
警告 |
---|
除非知道進程是什麼,並且知道附加到進程或可能取消進程所帶來的後果,否則不要附加到進程。例如,如果附加到 WinLogon 進程,然後停止調試,系統就會暫停,因爲沒有 WinLogon,系統無法運行。 |
只能將調試器附加到正在運行的服務。附加進程會中斷服務的當前運行;它並不真正終止或暫停服務的處理。也就是說,如果開始調試時服務正在運行,則在進行調試時,該服務從技術上說仍處於“已啓動”狀態,但它的處理已掛起。
附加到服務的進程使您能夠調試大多數服務代碼,但並非全部;例如,由於服務已經啓動,因此不能用這種方法調試服務的 OnStart 方法中的代碼,或調試用於加載服務的 Main 方法中的代碼。解決此問題的一個方法是:在唯一作用是幫助調試的服務應用程序中創建一個臨時服務。可以將兩個服務都安裝上,然後啓動此“虛擬”服務加載服務進程。臨時服務啓動了進程後,就可以使用 Visual Studio 中的“調試”菜單來附加到服務進程。
當附加該進程之後,可以設置斷點並使用這些斷點來調試代碼。當退出用於附加到該進程的對話框時,實際上已處於調試模式。您可以使用“服務控制管理器”開始、停止、暫停和繼續您的服務,因此命中已設置的斷點。調試成功後,移除此“虛擬”服務。
注意 |
---|
調試 OnStart 方法可能比較困難,因爲 Windows 服務管理器將所有嘗試啓動服務的時間限制在 30 秒內。有關更多信息,請參見疑難解答:調試 Windows 服務。 |
調試服務
-
安裝您的服務。有關更多信息,請參見如何:安裝和卸載服務。
-
可從“服務控制管理器”、“服務器資源管理器”或代碼啓動服務。有關更多信息,請參見如何:啓動服務。
-
在 Visual Studio 中,從“調試”菜單中選擇“進程”。
即會出現“進程”對話框。
-
單擊“顯示系統進程”。
-
在“可用進程”區域內單擊服務的進程,然後單擊“附加”。
提示 該進程將與服務的可執行文件同名。
出現“附加到進程”對話框。
-
選擇任意適當的選項,然後單擊“確定”關閉對話框。
注意 現在您處於調試模式。
-
設置要在代碼中使用的任意斷點。
-
訪問“服務控制管理器”並操縱您的服務,併發送停止、暫停和繼續命令以命中您的斷點。有關運行“服務控制管理器”的更多信息,請參見如何:啓動服務
。