當我們搭建好驅動開發環境後,就可以設定雙機除錯了,虛擬機器的安裝可以參考網上其他教程,比較簡單,我們直接來講設定雙擊除錯需要注意的一些地方。
1.設定被除錯的虛擬機器
首先,將虛擬機器關機,如果此時已經有了串列埠存在首先移除,管道名字輸入 \\.\pipe\com_1,並選擇“該端是伺服器”、“另一端是應用程式”:
然後 win + R 開啟命令列,輸入 msconfig ,做如下設定先不重啟:
2.設定 windbg 的快捷連線方式
由於我們之前安裝 SDK 和 WDK 的時候,會預設給我們安裝 windbg 經典版,若沒有安裝的話,也可以自己去網上找 windbg 的安裝包安裝一下即可,我的 windbg 安裝路徑是 F:\Windows Kits\10\Debuggers\x64\windbg.exe,我們需要給 windbg 提供啟動引數,讓它能夠應該和哪個管道進行連線。我們為 windbg 建立一個快捷方式,並右鍵快捷方式選擇屬性,在快捷方式選項卡下將目標
設定為:
"F:\\Windows Kits\\10\\Debuggers\\x64\windbg.exe" -b -k com:pipe,port=\\\\.\\pipe\\com_1,resets=0,reconnect -y
設定完成後,我們就可以直接透過點選這個快捷方式連線到虛擬機器。
3.禁用驅動簽名、開啟測試模式和複製 Boot 選單
最後我們需要禁用驅動簽名、開啟系統測試模式和複製 Boot 選單並重啟。由於在開發的過程中,我們測試自己寫好的驅動是沒有進行簽名的,無法在正常的系統上執行,所以我們需要禁用驅動簽名和開啟系統的測試模式,複製 Boot 選單是為了在每次系統啟動的時候我們可以選擇進入正常的系統或者進入我們配置好的除錯系統,只需要在虛擬機器上執行以下批處理命令即可:
bcdedit /set nointegritychecks on
bcdedit /set testsigning on
bcdedit /copy {current} /d "win10 x64 debug for windbg"
shutdown -s -t 1000
不禁用驅動簽名在載入驅動的時候就會出現如下情況:
然後在系統重啟的時候,我們選擇我們複製出來的引導項,也就是第二個,然後再次重啟進入系統的時候,我們點選建立的 windbg 快捷方式進行連線。
4.設定符號表和除錯資訊輸出
在 windbg 已經成功連線被除錯機的時候,可以開啟主選單 File,然後選擇 Symbol File Path 來設定符號表的位置,設定如下:
srv*D:\symbs*http://msdl.microsoft.com/download/symbols;D:\work\myp
roject\build\output\x64\Debug
這個設定的前半部分從微軟的網址下載符號表,並儲存到 D:\symbs 目錄下。而後半部分是工程的除錯版本的編譯輸出目錄,可以按照自己的真實路徑來調整。
一般來說,在除錯的時候,只要你按下了 Ctrl 加 Break 鍵中斷了被除錯機,然後輸入如下命令:
.reload
回車後,符號表就會開始載入或者下載。符號表無法下載的時候,必須把 Symbal path 設定中關於微軟的部分全部刪除。否則每次除錯的時候都會嘗試從微軟下載符號表,每次都會卡很長時間。
此時,在我們除錯的時候,可能會發現,當我們在驅動程式中編寫了列印除錯資訊的語句,但是 windbg 卻不顯示除錯資訊,原因是因為我們沒有設定合適的除錯資訊輸出等級,我們只要在 windbg 命令列中輸入以下命令執行即可:
//不區分大小寫,用於開啟Windows驅動或者核心除錯篩選器
ed kd_default_mask 0xffffffff
5.設定 windbg 的工作視窗
我們可以根據自己的習慣設定 windbg 的工作視窗,在選單欄中 View 中開啟相應的視窗並調整位置,並在 File 中儲存工作區,如下:
6.做好快照
最後,我們必須要對設定好的除錯環境做一個快照,因為 windows 每次啟動非常耗時。但更要命的是每次啟動之後,Windows 的記憶體佈局是不同的。透過快照,一方面我們每次可以直接恢復快照進行迅速連線,另一方面當我們的除錯系統出現環境異常或者崩潰的時候,我們也可以恢復最初始的環境,畢竟在除錯核心的過程中,藍色畫面是家常便飯。
不過值得一提的是,這裡有兩個地方需要注意:
- 在我們每次進行快照之前,我們先中斷除錯系統,然後再進行快照,下次恢復快照的時候,使用 windbg 快捷方式就可以直接連線上(否則大機率會出現無法直接連上的情況,我估計是因為當我們中斷除錯系統的時候,會對系統環境進行儲存,而若在沒有中斷系統的情況下進行儲存,下次再恢復快照的時候無法直接連上,需要每次點 windbg 的 “Break”(中斷) 命令才行)。
- 每當我們的 windbg 連線不上時,而被除錯的系統也在正常執行著,這時候點一下 WinDbg 的“Break”(中斷)命令一般就能夠連線上了。