通常有兩種方式建立兩地的遠端Debug, 第一種是 teamviewer, 第二種windbg
第一種 teamviewer
就是透過網路的方式可以讓你看到另一台電腦的螢幕, 並且能夠操作那台電腦, 但缺點是如果你的issue必須重新開機或是該issue跟網路與顯示有關的話, 通常連線就可能中斷, 無法繼續分析下去!
這時候就是透過第二種方式吧, windbg remote debugging
微軟其實也有寫得很詳細, 大致上就是建立如下圖的環境
解釋一下,
Debugging Server負責處理整個debug活動順利進行的平台: Host Computer
Debugging Client負責從遠端來控制debug session進行: Remote Computer
為了建立遠端的除錯, 第一個要設定好 debugging server, 然後才讓Client從遠端啟動.
這個地方要特別說一下, Target就是運行著要被除錯程式碼的電腦!
Target與 Host Computer 有時可以是同一台電腦, 有時候必須是分開的兩部電腦, 主要取決於你要除厝的程式碼是kernel mode還是user mode, 講到這裡大家應該可猜出答案, 對啦! 如果是kernel mode系統可能會隨時掛掉, 因此建議要分兩台電腦, 如果是user mode的debugging, 是可以勉強在同一台電腦OK的
介於兩端的連線協定, 有多種選擇: TCP, NPIPE, SPIPE, SSL,或是 COM Port.
假設我透過TCP連線, 並且使用winDbg軟體在 debugging Server/Client兩台電腦上, 作遠端kernel-mode除錯, 可以參考以下步驟:
1. 在 Host電腦, 開啟 windbg 並建立與Target之間的 kernel-mode debugging session
兩種方式:
#1. WinDbg Menu:
如果Windbg處於休眠狀態你可以選單File下拉, 選 Kernel Debug (或直接快捷鍵CTRL+K), 然後當 Kernel Debugging 對話窗出現時, 點選你建立的連線方式: NET, 1394, USB, COM, or Local.
#2. Command Prompt:
如果透過指令介面, 啟動WinDbg後輸入以下指令:
- windbg [-y SymbolPath] -k net:port=PortNumber,key=Key[,target=TargetIPAddress|TargetMachineName]
- windbg [-y SymbolPath] -k 1394:channel=1394Channel[,symlink=1394Protocol]
- windbg [-y SymbolPath] -k usb:targetname=USBString
- windbg [-y SymbolPath] -k com:port=ComPort,baud=BaudRate
- windbg [-y SymbolPath] -k com:pipe,port=\\VMHost\pipe\PipeName[,resets=0][,reconnect]
- windbg [-y SymbolPath] -k com:modem
- windbg [-y SymbolPath] -kl
- windbg [-y SymbolPath] -k
2. 暫時中斷,
從Debug選單選取Break, 或直接按 CTRL-Break.
3. 在視窗 Debugger Command Window, 輸入指令做連線
指令:
.server tcp:port=5005
(這個 port number 5005 可以根據你的狀況改變)
4. WinDbg將會回應如下面訊息
dbgcmd
Server started. Client can connect with any of these command lines 0: <debugger> -remote tcp:Port=5005,Server=YourHostComputer
5. 到了遠端電腦(remote computer)
開啟 WinDbg, 從選單File下拉, 選取 Connect to Remote Session
6. 在 Connection String 底下,
輸入
tcp:Port=5005,Server=YourHostComputer
這裡的 YourHostComputer 就必須視HOST電腦的名稱(debugging server).
再按 OK