本文將逐步告訴您,如何偵錯一個 Windows 服務藉由使用 WinDbg 偵錯工具 (windbg.exe)。若要偵錯 Windows 服務,您可以將 WinDbg 偵錯工具附加至處理序主控服務後啟動服務,或者,您可以設定服務啟動與 [WinDbg 偵錯工具附加,讓您可以疑難排解服務啟動相關的問題。本文將告訴您,這兩種方法。
需求
本文假設您已熟悉下列主題:
WinDbg 偵錯工具附加至服務,服務啟動之後
這個方法很類似您可用來偵錯工具附加至處理序和偵錯處理序的方法。
使用主控您要偵錯服務處理程序的處理程序識別碼
- 如果要判斷處理序識別碼 (PID) 裝載服務,您要偵錯程序的使用下列方法之一。
方法 1: 使用工作管理員
- 在工作列上按一下滑鼠右鍵,然後按一下 [工作管理員]。[Windows 工作管理員] 對話方塊隨即出現。
- 按一下 [Windows 工作管理員] 對話方塊的 [處理程序] 索引標籤。
- 影像名稱,] 下按一下 [裝載服務,您要偵錯程序的影像名稱]。請注意這項程序所指定的相對應的 [PID] 欄位的值的處理序 ID。
方法 2: 使用工作清單] 公用程式 (tlist.exe)
- 按一下 [開始],然後按一下 [執行]。[執行] 對話方塊隨即出現。
- 在 [開啟] 方塊中輸入 cmd,再按 [確定]。
- 在命令提示字元下,變更目錄路徑,以反映 tlist.exe 檔案在您的電腦上的位置。
附註tlist.exe 檔通常位於下列目錄: C:\Program Files\Debugging 工具 Windows 的 - 在的命令提示字元輸入 [tlist 若要列出影像名稱和處理的目前在您的電腦執行的所有處理序的識別碼]。
附註記下裝載服務,您要偵錯程序的處理序 ID。
- 在命令提示字元下,變更目錄路徑,以反映 windbg.exe 檔案在您的電腦上的位置。
附註如果不開啟命令提示字元,請依照下列步驟將和 b 方法 1。windbg.exe 檔通常位於下列目錄: C:\Program Files\Debugging 工具的 Windows。 - 在的命令提示字元輸入 [windbg –p ProcessID ProcessID/g 將 WinDbg 偵錯工具附加至處理序主控您要偵錯的服務]。
附註ProcessID 是裝載服務,您要偵錯程序的處理序 ID 預留位置。
使用主控您要偵錯服務處理程序的影像名稱
只有在剛好有一個執行的處理序主控您要執行的服務執行個體,您可以使用這個方法。要這麼做,請您執行下列步驟:
- 按一下 [開始],然後按一下 [執行]。[執行] 對話方塊隨即出現。
- 在 [開啟] 方塊輸入 cmd,],然後再按一下 [確定] 以開啟命令提示字元]。
- 在命令提示字元下,變更目錄路徑,以反映 windbg.exe 檔案在您的電腦上的位置。
附註windbg.exe 檔通常位於下列目錄: C:\Program Files\Debugging 工具的 Windows。 - 在的命令提示字元輸入 [windbg –pn ImageName ImageName/g 將 WinDbg 偵錯工具附加至處理序主控您要偵錯的服務]。
附註ImageName 是影像名稱主控您要偵錯服務處理程序的預留位置。在"-pn 」 命令列選項指定 ImageName 命令列引數是一個處理程序的影像名稱。
啟動 WinDbg 偵錯工具,並將附加至處理序主控您要偵錯的服務
- 啟動 Windows 檔案總管]。
- 尋找 windbg.exe 檔案在您的電腦上。
附註windbg.exe 檔通常位於下列目錄: C:\Program Files\Debugging 工具 Windows 的 - 執行 windbg.exe 檔一起搭配 使用/g 命令列參數,以啟動 [WinDbg 偵錯工具。/ g 命令列參數可讓追蹤的程序繼續執行後中斷點設定。
- 在 [檔案] 功能表上按一下 [附加至處理程序 至顯示 [附加至處理序] 對話方塊]。
- 按一下以選取對應到處理程序該主機服務,您要偵錯的節點,然後按一下 [確定]。
- 在出現該對話方塊,按一下 [是] 儲存基底的工作區資訊。請注意您現在可以進行偵錯 disassembled 的程式碼,您的服務。
要設定服務以 [WinDbg 開始偵錯工具附加
您可以使用這個方法來偵錯服務,如果您想要疑難排解服務啟動相關的問題。
- 設定影像檔案執行選項。如果要執行此動作使用其中一個下列方法:
方法 1: 使用全域旗標編輯器 (gflags.exe)
- 啟動 Windows 檔案總管]。
- 尋找 gflags.exe 檔案在您的電腦上。
附註gflags.exe 檔通常位於下列目錄: C:\Program Files\Debugging 工具的 Windows。 - 執行 gflags.exe 檔案啟動全域旗標編輯器。
- 在 影像檔案名稱] 文字方塊中輸入裝載服務,您要偵錯處理序影像名稱。比方說如果您想有 MyService.exe 做為影像名稱的程序所裝載的服務進行偵錯,輸入 MyService.exe。
- 在 [目的地,按一下以選取 [映像檔案選項] 選項。
- 在 [影像偵錯工具選項,按一下以選取 [偵錯工具] 核取方塊。
- 在 [偵錯工具] 文字方塊中鍵入 [您想要使用偵錯工具的完整路徑]。比方說如果想使用 WinDbg 偵錯工具來對服務進行偵錯您可以輸入類似下列的完整路徑: Windows\windbg.exe 的 C:\Program Files\Debugging 工具
- 按一下 [套用],然後再按一下 [確定],結束全域旗標編輯程式 」。
方法 2: 使用 「 登錄編輯程式 」
- 按一下 [開始],然後按一下 [執行]。[執行] 對話方塊隨即出現。
- 在 [開啟] 方塊中輸入 regedit,然後按一下 [以啟動 [登錄編輯程式] 中的 [確定]。
- 重要這個區段、 方法或任務包含告訴您如何修改登錄的步驟。然而,如果您不當修改登錄,可能會發生嚴重的問題。因此,執行這些步驟時請務必小心。為加強保護,修改登錄之前,請務必將它備份起來。以後您就可以在發生問題時還原登錄。如需有關如何備份和還原登錄的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
322756?
(http://support.microsoft.com/kb/322756/
)
如何備份和還原在 Windows 登錄
在 [登錄編輯程式] 中,找出,並用滑鼠右鍵按一下下列登錄子機碼:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Image File Execution Options
- 指向 [新增],然後再按一下 [索引鍵。在左窗格的 「 登錄編輯程式中中, 請注意 新機碼 # 1 (新的登錄子機碼名稱) 已被選取供編輯]。
- 鍵入 ImageName 以取代 新機碼 # 1,並按下 ENTER。
附註ImageName 是影像名稱主控您要偵錯服務處理程序的預留位置。比方說如果您想有 MyService.exe 做為影像名稱的程序所裝載的服務進行偵錯,輸入 MyService.exe。 - 用滑鼠右鍵按一下您在步驟 e 建立該登錄子機碼]。
- 指向 [新增],然後再按一下 [字串值。在右窗格的 「 登錄編輯程式中中, 請注意 新數值 # 1,新的登錄項目的名稱已被選取用於編輯]。
- 新數值 # 1 取代 偵錯工具,並按下 ENTER。
- 您在步驟 h 中建立 偵錯工具 登錄項目上按一下滑鼠右鍵,然後按一下 [修改]。[編輯字串] 對話方塊隨即出現。
- 在 [數值資料] 文字方塊中輸入 DebuggerPath,],然後再按一下 [確定]]。
附註DebuggerPath 是您想要使用偵錯工具的完整路徑的預留位置。比方說如果想使用 WinDbg 偵錯工具來對服務進行偵錯您可以輸入類似下列的完整路徑:C:\Progra~1\Debugg~1\windbg.exe
- 偵錯工具視窗會出現在您的桌面,並與偵錯工具互動為了讓您的服務互動。如果您不要進行您的服務互動,偵錯工具將會啟動,但您無法檢視它,無法發出命令。若要讓您的服務互動,使用下列方法之一:
方法 1: 使用 [服務] 主控台
- 按一下 [開始],然後再指向 [程式集。
- 在 [程式集] 功能表上指向 [系統管理工具,然後按一下 [服務]。會顯示 [服務] 主控台。
- 在右窗格的 服務 中主控台、 ServiceName 上, 按一下滑鼠右鍵,然後按一下 [內容]。
附註ServiceName 是服務的您要偵錯名稱預留位置。 - [登入] 索引標籤上,按一下以選取 [允許服務與桌面互動] 核取方塊,以 本機系統帳戶,然後再按一下 [確定]。
方法 2: 使用 「 登錄編輯程式 」
- 在 [登錄編輯程式] 中,找出,並按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceName
附註ServiceName 取代為您要偵錯服務的名稱。比方說如果要偵錯服務,名為 MyService 找出並按一下下列登錄機碼:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyService
- 在右窗格的 「 登錄編輯程式中的 [名稱] 欄位下 類型,] 上按一下滑鼠右鍵,然後按一下 [修改]。[編輯 DWORD 值] 對話方塊隨即出現。
- 數值資料 中的文字變更文字方塊以二進位的 OR 運算的結果,以二進位值目前的文字和二進位值做為兩個運算元的 0x00000100。二進位值,0x00000100,對應至 SERVICE_INTERACTIVE_PROCESS 常數定義於 WinNT.h 標頭檔,在您的電腦上。這個常數會指定服務是互動式在本質。
- 當服務啟動時,服務會通訊至服務控制管理員多久服務必須要有開始 (服務在逾時期間)。如果 「 服務控制管理員 」 不會收到 「 服務已啟動 」 請注意從服務這個逾時期限內,服務控制管理員會結束處理序主控服務。這個逾時期間通常是少於 30 秒。如果您不要調整這個逾時期間,服務控制管理員結束程序,並附加偵錯工具嘗試偵錯時。若要調整此逾時期間,請依照下列步驟執行:
- 在 [登錄編輯程式] 中,找出,並用滑鼠右鍵按一下下列登錄子機碼:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
- 指向 [新增],然後再按一下 [DWORD 值。在右窗格的 「 登錄編輯程式中中, 請注意 新數值 # 1 (新的登錄項目的名稱) 已被選取用於編輯]。
- 鍵入 ServicesPipeTimeout 以取代 新數值 # 1,並按下 ENTER。
- 以滑鼠右鍵按一下 ServicesPipeTimeout 登錄項目您在步驟 c 中建立,然後按一下 [修改]。[編輯 DWORD 值] 對話方塊隨即出現。
- 在 [數值資料] 文字方塊中輸入 TimeoutPeriod,],然後再按一下 [確定]
附註TimeoutPeriod 是您想要設定服務的逾時期間 (以毫秒為單位) 的值預留位置。比方說如果您想將逾時期間設為 24 小時 (86400000 毫秒),輸入 86400000。 - 重新啟動電腦。您必須重新啟動電腦的服務控制管理員 」 來套用這個變更。
- 啟動您的 Windows 服務。要這麼做,請您執行下列步驟:
- 按一下 [開始],然後再指向 [程式集。
- 在 [程式集] 功能表上指向 [系統管理工具,然後按一下 [服務]。會顯示 [服務] 主控台。
- 在右窗格的 服務 中主控台、 ServiceName 上, 按一下滑鼠右鍵,然後按一下 [開始]。
附註ServiceName 是服務的您要偵錯名稱預留位置。
疑難排解
您嘗試透過網路,對服務進行偵錯前請確定符號與服務會使用來源檔案是可以從執行服務的電腦存取。如果要執行此動作使用其中一個下列方法:
- 包含符號] 和 [來源檔案,則服務會使用您電腦上資料夾的所有人都給予至少讀取存取權限。
- 將這些符號和服務使用的原始程式檔複製到電腦會執行服務。
如果要下載該工具和公用程式,本文所提,請造訪下列 Microsoft 網站 (英文):
如需詳細資訊,請造訪下列 Microsoft 開發人員網路 MSDN 網站: