作法:偵錯 Windows 服務應用程式

注意

本文不適用於 .NET 中的託管服務。 如需使用 Microsoft.Extensions.Hosting.BackgroundService 和背景工作角色服務範本之 Windows 服務的最新內容,請參閱:

服務必須從服務控制管理員內容之中執行,而不是從 Visual Studio 之中執行。 因此,對服務進行偵錯不像是對其他 Visual Studio 應用程式類型進行偵錯那樣簡單直接。 若要對服務進行偵錯,您必須啟動服務,然後將偵錯工具附加至執行中的處理序。 之後就可以使用 Visual Studio 所有的標準偵錯功能,對應用程式進行偵錯。

警告

除非您知道處理序的內容,並了解附加至處理序以及可能會刪除該處理序的後果,否則就不應該附加至處理序。 例如,如果您附加至 WinLogon 處理序,再停止偵錯,系統將會中止,因為系統沒有 WinLogon 就無法運作。

您只可以將偵錯工具附加至執行中的服務。 附加程序會中斷服務的目前運作,但不會實際停止或暫停服務的處理。 也就是說,當您開始偵錯時,如果您的服務正在執行,技術上來說,正在進行偵錯的服務還是處於啟動狀態,但已暫停其處理。

附加至處理序之後,您可以設定中斷點,並使用這些中斷點對程式碼進行偵錯。 一旦您結束用來附加至處理序的對話方塊,就會立即處於偵錯模式中。 您可以使用服務控制管理員來啟動、停止、暫停及繼續服務,以此方式來叫用您所設定的中斷點。 偵錯成功之後,您就可以移除這項虛擬服務。

本文涵蓋對本機電腦上執行的服務進行偵錯,但您也可以對遠端電腦上執行的 Windows 服務進行偵錯。 請參閱遠端偵錯

注意

OnStart 方法進行偵錯可能是項困難的工作,因為服務控制管理員對於啟動服務的所有嘗試都強加上 30 秒的限制。 如需詳細資訊,請參閱疑難排解:對 Windows 服務進行偵錯

警告

若要取得有關偵錯的有意義資訊,Visual Studio 偵錯工具必須在符號檔中找到正在進行偵錯的二進位檔案。 如果您想要對建置於 Visual Studio 中的服務進行偵錯,符號檔 (.pdb 檔) 會與可執行檔或程式庫位於同一個資料夾中,並且偵錯工具會自動載入檔案。 如果您想要對非您所建置的服務進行偵錯,則應該先找到服務的符號,並確定偵錯工具可以找到這些符號。 請參閱在 Visual Studio 偵錯工具中指定符號 (.pdb) 和來源檔案。 如果您想要對系統處理序進行偵錯,或想要在您的服務中有系統呼叫的符號,則應該加入 Microsoft 符號伺服器。 請參閱偵錯符號 \(英文\)。

偵錯服務

  1. 在偵錯組態中建置您的服務。

  2. 安裝您的服務。 如需詳細資訊,請參閱 How to: Install and Uninstall Services

  3. 從 [服務控制管理員]、[伺服器總管] 或從程式碼啟動您的服務。 如需詳細資訊,請參閱如何:啟動服務

  4. 使用系統管理認證啟動 Visual Studio,以便能夠附加至系統處理程序。

  5. (選擇性) 在 Visual Studio 功能表列上,選擇 [工具]、[選項]。 在 [選項] 對話方塊中,選擇 [偵錯]、[符號],選取 [Microsoft 符號伺服器] 核取方塊,然後選擇 [確定] 按鈕。

  6. 在功能表列上,從 [偵錯] 或 [工具] 功能表中選擇 [附加至處理序]。 (鍵盤:Ctrl+Alt+P)

    [處理序] 對話方塊隨即出現。

  7. 選取 [顯示所有使用者的處理序] 核取方塊。

  8. 在 [可使用的處理序] 區段中,選擇服務的處理序,然後選擇 [附加]

    提示

    處理序的名稱和您的服務可執行檔名稱相同。

    [附加至處理序] 對話方塊隨即出現。

  9. 選擇適當選項,然後選擇 [確定] 關閉對話方塊。

    注意

    您現在已處於偵錯模式中。

  10. 在程式碼中設定任何想要使用的中斷點。

  11. 存取服務控制管理員並操作您的服務,傳送停止、暫停和繼續命令來叫用中斷點。 如需執行服務控制管理員的詳細資訊,請參閱如何:啟動服務。 另請參閱疑難排解:對 Windows 服務進行偵錯

Windows 服務的偵錯秘訣

附加至服務的處理序可讓您對大多數的服務程式碼進行偵錯,但並非所有的服務程式碼都可用這種方式偵錯。 例如,由於已經啟動服務,因此您無法以這種方式對服務之 OnStart 方法中的程式碼,或對用來載入服務之 Main 方法中的程式碼進行偵錯。 解決這個限制的其中一個方法,是在您的服務應用程式中,建立僅用於協助偵錯的第二個暫時性服務。 您可以安裝這兩項服務,然後再啟動這個虛擬服務以載入服務處理序。 一旦暫時性服務啟動了處理序,您就可以使用 Visual Studio 中的 [偵錯] 功能表來附加至服務處理序。

嘗試加入對 Sleep 方法的呼叫,將動作延遲到能夠附加至處理序之後。

嘗試將程式變更為一般主控台應用程式。 若要執行這項操作,請依照下列方式重寫 Main 方法,以根據程式的啟動方式,將程式當做 Windows 服務或主控台應用程式來執行。

如何:將 Windows 服務當做主控台應用程式來執行

  1. 將方法加入執行 OnStartOnStop 方法的服務:

    internal void TestStartupAndStop(string[] args)  
    {  
        this.OnStart(args);  
        Console.ReadLine();  
        this.OnStop();  
    }  
    
  2. 依照下列方式重寫 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.  
        }  
    }
    
  3. 在專案屬性的 [應用程式] 索引標籤中,將 [輸出類型] 設定為 [主控台應用程式]

  4. 選擇 [開始偵錯] (F5)。

  5. 若要再次將程式當做 Windows 服務來執行,請以適用於 Windows 服務的方式來安裝及啟動程式。 您不需要回復這些變更。

在某些情況下 (例如當您想要偵錯只在系統啟動時發生的問題時),您必須使用 Windows 偵錯工具。 下載 Windows 驅動程式套件 (WDK),並參閱如何偵錯 Windows 服務

另請參閱