天天看點

調試window服務

本文分步介紹了如何調試 Windows 服務使用 WinDbg 調試器 (windbg.exe)。 若要調試 Windows 服務,您可以将 WinDbg 調試器附加到服務啟動之後, 承載服務的程序,或可以配置服務能夠啟動與在 WinDbg 調試器附加以便即可解決服務啟動相關的問題。 本文介紹了這兩種方法。

調試window服務

回到頂端

要求

<script type="text/javascript"></script> 本文假定您熟悉下列主題:

  • Windows 服務
  • WinDbg 調試器
調試window服務

回到頂端

在服務啟動後,将 WinDbg 調試程式附加到服務

<script type="text/javascript"></script> 此方法非常類似于可用于将調試程式附加到程序和然後調試程序的方法。

使用托管服務要調試的程序的程序 ID

<script type="text/javascript"></script>

  1. 若要确定程序 ID (PID) 承載您要調試的服務的程序的請使用下列方法之一。
    • 方法 1: 使用任務管理器
      <script type="text/javascript"></script>
      1. 右鍵單擊該的工作列,然後單擊 任務管理器 。 Windows 任務管理器 對話框。
      2. 單擊 Windows 任務管理器 對話框的 程序 頁籤。
      3. 在 映像名稱 ,下單擊承載您要調試的服務的程序的映像名稱。 請注意此過程由相應的 PID 字段的值指定的程序 ID。
    • 方法 2: 使用任務清單實用工具 (Tlist.exe)
      <script type="text/javascript"></script>
      1. 單擊 開始 ,然後單擊 運作 。 出現 運作 對話框。
      2. 在 打開 的框中鍵入 cmd ,然後單擊 确定 。
      3. 在指令提示符更改目錄路徑以反映 Tlist.exe 檔案在您的計算機上的位置。

        請注意 Tlist.exe 檔案通常位于以下目錄: C:/Program Files /Debugging Tools for Windows

      4. 在指令提示符下,鍵入 tlist 列出圖像名稱和程序的目前正在您的計算機運作的所有程序的 ID。

        請注意 記下承載您要調試的服務的程序的程序 ID。

  2. 在指令提示符下更改目錄路徑以反映 windbg.exe 檔案在您的計算機上的位置。

    請注意 如果指令提示符下不打開,請按照下列步驟在和 b 的方法 1。 windbg.exe 檔案通常位于以下目錄: C:/Program Files /Debugging Tools for Windows。

  3. 在指令提示符下,鍵入 windbg –p ProcessID / g 将 WinDbg 調試器附加到承載服務要調試的程序。

    請注意 ProcessID 是程序的一個占位符承載您要調試的服務的程序 ID。

使用承載您要調試的服務的程序的映像名稱

<script type="text/javascript"></script> 可以使用此方法僅當承載您要運作的服務的程序的一個正在運作的執行個體。 要這樣做,請按下列步驟操作:

  1. 單擊 開始 ,然後單擊 運作 。 出現 運作 對話框。
  2. 在 打開 框鍵入 cmd ,然後單擊 确定 以打開指令提示符。
  3. 在指令提示符更改目錄路徑以反映 windbg.exe 檔案在您的計算機上的位置。

    請注意 windbg.exe 檔案通常位于以下目錄: C:/Program Files /Debugging Tools for Windows。

  4. 在指令提示符下,鍵入 windbg –pn ImageName / g 将 WinDbg 調試器附加到承載服務要調試的程序。

    請注意 ImageName 是程序的承載您要調試的服務的映像名稱占位符。 在"-pn"指令行選項指定 ImageName 指令行參數是一個程序的圖像名稱。

啟動 WinDbg 調試器,并附加到承載您要調試的服務的程序

<script type="text/javascript"></script>

  1. 啟動 Windows 資料總管。
  2. 找到您的計算機上 windbg.exe 檔案。

    請注意 windbg.exe 檔案通常位于以下目錄: C:/Program Files /Debugging Tools for Windows

  3. 運作 windbg.exe 檔案一起使用 / g 指令行開關啟動在 WinDbg 調試器。 / g 指令行開關允許跟蹤的程序繼續設定中斷點後。
  4. 在 檔案 菜單中上, 單擊顯示 附加到程序 對話框的 附加到程序 。
  5. 單擊以選中對應于程序承載您要調試,服務的節點,然後單擊 确定 。
  6. 在出現的對話框中,單擊 是 以儲存基工作區資訊。 請注意您可以現在調試您的服務的 disassembled 的代碼。
調試window服務

回到頂端

配置服務啟動,WinDbg 附加調試程式

<script type="text/javascript"></script> 可以使用此方法來調試服務,如果要解決服務啟動相關的問題。

  1. 配置"圖像檔案執行"選項。 為此,請使用下列方法之一:
    • 方法 1: 使用全局标志編輯器 (Gflags.exe)
      <script type="text/javascript"></script>
      1. 啟動 Windows 資料總管。
      2. 找到您的計算機上 Gflags.exe 檔案。

        請注意 Gflags.exe 檔案通常位于以下目錄: C:/Program Files /Debugging Tools for Windows。

      3. 運作 Gflags.exe 檔案以啟動全局标志編輯器。
      4. 在 圖像檔案名稱 文本框中,鍵入承載您要調試的服務的程序的映像名稱。 是例如如果您要調試由具有 MyService.exe 作為圖像名稱的程序承載的服務,鍵入 MyService.exe 。
      5. 目标 下, 單擊以選擇 圖像檔案選項 選項。
      6. 圖像調試器選項 ,下單擊以選中 調試器 複選框。
      7. 調試器 文本框中鍵入您要使用的調試器的完整路徑。 是例如如果您要使用 WinDbg 調試器調試服務,您可以鍵入類似于以下内容的完整路徑: C:/Program Files /Debugging Tools,for Windows/windbg.exe
      8. 單擊 應用 ,然後單擊 确定 以退出全局标記編輯器。
    • 方法 2: 使用系統資料庫編輯器
      <script type="text/javascript"></script>
      1. 單擊 開始 ,然後單擊 運作 。 出現 運作 對話框。
      2. 在 打開 的框中鍵入 regedit ,然後單擊 确定 以啟動系統資料庫編輯器。
      3. 重要 此部分、 方法,或任務包含告訴您如何修改系統資料庫的步驟。 但是,如果錯誤地修改系統資料庫,就可能發生嚴重的問題。 是以,請確定認真執行這些步驟。 添加的保護系統資料庫之前先備份您修改它。 然後,發生問題時可以還原系統資料庫。 有關如何備份和還原在系統資料庫的詳細資訊,單擊下面的文章編号,以檢視 Microsoft 知識庫中相應: 322756  (http://support.microsoft.com/kb/322756/ ) 如何備份和還原在 Windows 系統資料庫

        在系統資料庫編輯器中,查找,然後右鍵單擊下的系統資料庫子項: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Image File Execution Options

      4. 指向 建立 ,然後單擊 鍵 。 在系統資料庫編輯器在左窗格,會注意到 新項 # 1 (新的系統資料庫子項的名稱) 中選擇進行編輯。
      5. 鍵入 ImageName 替換 新項 # 1 ,然後按 Enter 鍵。

        請注意 ImageName 是程序的承載您要調試的服務的映像名稱占位符。 是例如如果您要調試由具有 MyService.exe 作為圖像名稱的程序承載的服務,鍵入 MyService.exe 。

      6. 用滑鼠右鍵單擊在步驟 e 中建立系統資料庫子項。
      7. 指向 建立 ,然後單擊 字元串值 。 在系統資料庫編輯器在右窗格,會注意到 新值 # 1 ,一個新的系統資料庫項的名稱選擇進行編輯。
      8. 使用 調試器 ,替換 新值 # 1 ,,然後按 ENTER 鍵。
      9. 右鍵單擊您在步驟 h, 調試程式 系統資料庫項,然後單擊 修改 。 編輯字元串 對話框。
      10. 在該 數值資料 文字框鍵入 DebuggerPath,然後單擊 确定 。

        請注意 DebuggerPath 是調試器的完整路徑,您要使用的占位符。 是例如如果您要使用 WinDbg 調試器調試服務,您可以鍵入類似于以下的完整路徑: C:/Progra~1/Debugg~1/windbg.exe

  2. 調試程式視窗會出現在您的桌面上并與調試程式互動,使您的服務互動。 如果您沒有進行您服務互動,調試程式将啟動您無法看到該但不能發出指令。 要使您服務互動,請使用下列方法之一:
    • 方法 1: 使用服務控制台
      <script type="text/javascript"></script>
      1. 單擊 開始 ,然後指向 程式 。
      2. 在 程式 菜單上指向 管理工具 ,然後單擊 服務 。 将出現 服務 控制台。
      3. 在 服務 的右窗格中控制台右鍵單擊 ServiceName,單擊 屬性 。

        請注意 ServiceName 是一個占位符要調試服務的名稱。

      4. 在 登入 頁籤上,請單擊以選中 允許服務與桌面互動 複選框在 本地系統帳戶 下,,然後單擊 确定 。
    • 方法 2: 使用系統資料庫編輯器
      <script type="text/javascript"></script>
      1. 在系統資料庫編輯器找到,并單擊以下系統資料庫子項: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/ServiceName 請注意 ServiceName 替換為要調試的服務的名稱。 是例如如果要調試服務名為 MyService,找到,并單擊下面的系統資料庫項: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/MyService
      2. 在系統資料庫編輯器的右窗格中, 名稱 字段的下方 類型 ,右鍵單擊,然後單擊 修改 。 編輯 DWORD 值 對話框。
      3. 更改 數值資料 中的文本的目前文本和二進制的值 0x00000100,為兩個操作數文本框二進制或運算的結果,使用二進制值。 二進制的值,0x00000100,對應于計算機上的 WinNT.h 标頭檔案中定義的 SERVICE_INTERACTIVE_PROCESS 常量。 該常量指定服務是互動式在本質上。
  3. 服務啟動時, 該服務通信到服務控制管理器多長時間服務必須啟動 (服務的逾時時間)。 如果服務控制管理器沒有收到"服務已啟動"通知服務此逾時期限内,服務控制管理器會終止承載服務的程序。 此逾時期限通常是小于 30 秒。 如果不要調整此逾時時間,服務控制管理器結束程序并附加的調試器時要嘗試進行調試。 要調整此逾時時間,請按下列步驟操作:
    1. 在系統資料庫編輯器中,查找,然後右鍵單擊下的系統資料庫子項: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control
    2. 指向 建立 ,然後單擊 DWORD 值 。 在系統資料庫編輯器在右窗格,會注意到 新值 # 1 (新的系統資料庫項的名稱) 中選擇進行編輯。
    3. 鍵入 ServicesPipeTimeout 替換 新值 # 1 ,然後按 Enter 鍵。
    4. 右鍵單擊 ServicesPipeTimeout 系統資料庫項,您在步驟 c,然後單擊 修改 。 編輯 DWORD 值 對話框。
    5. 在該 數值資料 文字框鍵入 TimeoutPeriod,,,然後單擊 确定

      請注意 TimeoutPeriod 是一個占位符逾時時間 (以毫秒計) 要為服務設定的值。 是例如如果您要将逾時時間段設定為 24 小時 (86400000 毫秒),鍵入 86400000 。

    6. 重新啟動計算機。 必須重新啟動計算機的服務控制管理器若要将此更改應用。
  4. 啟動您的 Windows 服務。 要這樣做,請按下列步驟操作:
    1. 單擊 開始 ,然後指向 程式 。
    2. 在 程式 菜單上指向 管理工具 ,然後單擊 服務 。 将出現 服務 控制台。
    3. 在 服務 的右窗格中控制台右鍵單擊 ServiceName,單擊 開始 。

      請注意 ServiceName 是一個占位符要調試服務的名稱。

調試window服務

回到頂端

疑難解答

<script type="text/javascript"></script> 在您嘗試通過網絡調試服務之前,請確定符号和服務使用的源檔案可以從将運作服務的計算機通路。 為此,請使用下列方法之一:

  • 至少讀通路權限授予 Everyone 檔案夾在包含符号和源代碼檔案服務使用的計算機上。
  • 将這些符号和服務使用的源檔案複制到将運作服務的計算機中。

繼續閱讀