VirtualBox+Windbg 進行雙機除錯的方法
以前見他們除錯驅動程式之類的都是使用的VMWare, 我沒怎麼用這軟體, 感覺這軟體有點臃腫, 後臺服務掛得太多了, 感覺不爽, 於是就沒搞它.
加上電腦上很早就裝有Oracle的Virtual Box, 於是就看了下, 其實Virtual Box也有支援串列埠裝置, 按理說也可以用Windbg進行連線的. 一直覺得Virtual Box挺好用的.
既然寫了這篇部落格, 那就證明我確實已經成功地進行除錯了.
下面說下步驟吧(已經完成的就忽略吧):
(如果圖片顯示不完整, 請在右鍵選單中檢視該圖片)
1.安裝Virtual Box虛擬機器
官方網址:https://www.virtualbox.org/
在左邊找到Downloads標籤, 選擇合適自己平臺的安裝包就行了(可比VMWare小多了).
這軟體自帶中文語言包, 且說是開源+免費軟體, 所以不要到其它地方去找什麼破解, 綠色之類, 搞得不好反倒弄一身的XX.
2.安裝虛擬機器作業系統
對於VBox安裝虛擬機器作業系統, 百度一下, 太多了...百度吧.
我安裝的作業系統是XP_SP3, 新手嘛, 還是從"低階"的東西慢慢學起.
3.對虛擬機器中的作業系統進行額外的設定
常規的設定,比如記憶體大小, 視訊記憶體大小等, 請酌情分配就行.
3.1 對串列埠的支援設定(需要在關機的條件下設定)
注意管道的命名規則, 否則會建立失敗.
3.2 在虛擬機器和實機之間共享檔案
第一種辦法(目錄共享):
第二種辦法(簡單方便, 但貌似會使電腦出現拖放問題):
3.3 修改作業系統配置檔案以啟動除錯模式
在虛擬機器中, 找到 C:\Windows\boot.ini(隱藏,只讀),在最後加上一行:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
/debugport=com1就是上面建立的管道的命名後面的部分:\\.\pipe\com1,/baudrate=115200表示設定波特率(這個可以大點,速度快些,但不能隨便亂設定)
/debug 表示啟用除錯
修改後大概是這樣的:
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=com1 /baudrate=115200
重啟虛擬機器, 選擇第2項啟動選單進入除錯模式:
4. 配置Windbg進行除錯
4.1 下載符號檔案(如果沒有)
1) 到http://msdn.microsoft.com搜尋下載
2)到
我下載的是Windows XP with Service Pack 3 x86 checked symbols, all languages (File size: 202 MB)
自己按需下載吧.
4.2 新建一批處理指令碼檔案(雙機除錯.bat)
內容如下:
@echo off
::除錯Windbg的路徑(有空格請加上雙引號)
set Windbg="D:\WinDDK\7600.16385.1\Debuggers\windbg.exe"
::設定命令列引數
::其中com:port=\\.\pipe\com1是上面建立的管道. 波特率設定要一致
::-y H:\Cache\symbols表示除錯符號檔案的路徑
set Param=-b -k com:port=\\.\pipe\com1,baud=115200,pipe -y D:\WinDDK\symbols
::開啟除錯
start "" %Windbg% %Param%
goto :eof
附圖
儲存後, 直接雙擊開啟該bat指令碼檔案即可開啟WinDbg並除錯虛擬機器(先要開啟虛擬機器並進入除錯模式)
一開始虛擬機器可能處理未響應狀態(被除錯), 按照上面的說明, 在下面的命令列中執行命令g即可繼續.
之後通過共享檔案的方式, 載入相應的驅動/程式, 通過手動下斷點的方式進入除錯:
在驅動中手動加入斷點:
#if DBG
__asm int 3
#endif
即可使虛擬機器掛起到除錯狀態了.