前言
當我們沒有兩台物理機時,又想做雙機內核調試怎么辦?當然是裝虛擬機啦!本文總結了使用 VMware15.5 + win10 + virtualkd + windbg
搭建雙機內核調試環境。
安裝環境
-
VMware
版本:15.5 pro
。可以到 VMware 官網下載地址 下載最新版本。 -
我的物理主機系統:
win10 1909
。其它版本的windows
也可以,VMware15.5
最低支持win7
系統。 -
虛擬機系統鏡像:
win10 1809 x64
。其它版本的系統也可以。我們可以在 msdn i tell you 上面找到各個版本的windows
官方鏡像。除了系統鏡像,還包括其它很多工具的官方鏡像,比如vs
,office
等。 -
windbg
版本:10.0.18362.1
,其它版本的也可以。windbg
包含在windows sdk
中。可以到微軟官網 SDK 下載地址 下載。如果只需要windbg
,推薦下載.exe
形式的安裝包。在安裝的時候,可以只勾選Debugging Tools for Windows
。

安裝 VMware
& 安裝 win10
下載 VMware
到本地后,直接雙擊即可安裝,一路點擊 下一步
即可。需要注意以下兩點:
- 盡量下載最新版本的
VMware
,早期版本的VMware
在win10 1909
上可能有兼容性問題。 - 安裝完成后,最好重啟系統!
安裝好 VMware
后,就可以安裝系統鏡像了。通過 文件(F) -> 新建虛擬機(N)
即可開始 新建虛擬機向導
。一般我們通過 安裝程序光盤映像文件(iso)(M)
的形式選擇下載好的系統鏡像安裝,然后一路 下一步(N)
即可。

安裝完成后,可以啟動了。但是可能遇到一些問題,我做了簡單的總結。
可能遇到的問題
- 提示
Intel VT-x
被禁用。
根據提示,在 BIOS
里開啟 Intel VT-x
。
重啟進入BIOS
,打開 Intel Virutal Technology
,按 F10
保存退出。

- 提示
VMware Workstation
與Device/Credential Guard
不兼容。

強烈建議先檢查下 Hyper-V
是否開啟,如果開啟了,請先關閉 Hyper-V
。

如果關閉 Hyper-V
后還是出現上圖的提示。請參考 禁用 Device/Credential Guard 的微軟官方文檔。
點擊工具下載鏈接,下載相應的腳本文件到本地。如果我們的系統不是英文系統,按照提示改變腳本里的
*$OSArch = $(gwmi win32_operatingsystem).OSArchitecture
為 $OSArch = $((gwmi win32_operatingsystem).OSArchitecture).tolower()
然后以管理員權限執行 DG_Readiness_Tool_v3.6.ps1 -Disable -AutoReboot
即可。
-Disable
表示關閉。
-AutoReboot
表示自動重啟系統,根據自己的需要指定。

重啟后,會有提示是否要真的禁用此特性。按 Windows
鍵或者 F3
鍵禁用,按Esc
跳過。

順利安裝完系統過后,我們就可以開始進行雙機內核調試了。
通過虛擬串口方式連接
如果我們希望通過虛擬串口的形式連接,我們在系統設置前,一定要注意: VMware
中的打印機會占用默認的 串口 1
。如果不移除打印機,我們新建的串口會是 串口 2
(這樣,我們在被調試系統中設置的時候,需要設定debugport
的值為 2
)。

當然,我們可以移除打印機,然后新建串口,這樣新建的串口就是默認的 串口 1
了。

我以保留打印機,使用 COM2
為例,錄制了一份屏幕錄像。這里對整個操作過程做一個簡要描述:
-
新建串口,因為打印機占用了
串口 1
,所以我們新建的串口是串口 2
。 -
設置
pipe
參數,我設置的是\\.\pipe\bcn_com
,其他參數默認即可。 -
啟動虛擬機系統,設置調試參數,命令如下:
bcdedit /debug on bcdedit /dbgsettings serial debugport:1 baudrate:115200
-
以管理員權限運行
windbg
,通過界面連接。 -
重啟虛擬機系統,發現連接不上。因為我們新建的串口是
串口 2
,而我們在虛擬機系統里設置的是串口 1
。 -
重啟虛擬機系統,設置調試參數,命令如下:
bcdedit /debug on bcdedit /dbgsettings serial debugport:2 baudrate:115200
-
重啟虛擬機系統,這次成功連接上了。
-
最后,還演示了
windbg
通過命令行直接連接。命令行如下:windbg.exe -k com:pipe,port=\\.\pipe\bcn_com,reconnect
通過 VirtualKD
經常做雙機內核調試的小伙伴兒一定對 VirtualKD
不陌生。可以大大提高雙機內核調試的速度,可謂神器。
幾年前,用 VirtualKD
搭建雙機內核調試環境很簡單。沒想到這次居然各種連接不上。通過 google
搜索關鍵字 VMware15 VirtualKD
,在 VirtualKD github issues 和 看雪論壇『求助問答』的帖子 看到已經有小伙伴兒遇到這個問題了。應該是 VirtualKD3.0
與 VMware15.5
不兼容。真是個壞消息,不過也有好消息 —— 已經有大佬解決了這個問題,github
上對應的倉庫是 VirtualKD-Redux。
在查找解決方案的過程,發現有人遇到另外一個問題。在虛擬機里執行 bcdedit /debug on
失敗,提示值被保護,如下圖:

可以在 虛擬機設置
的 高級
選項里,禁用 安全引導
。

VirutalKD-Redux
的使用方法和 VirutalKD
一樣,簡要步驟如下:
- 在調試主機端運行
vmmon64.exe
,點擊Debugger Path...
選擇調試器路徑。 - 把
target64
拷貝到虛擬機中(如果是32
位系統,請拷貝target32
)。 - 在虛擬機中執行
target64
目錄下的vminstall.exe
安裝VirtualKD-Redux
。 - 重啟虛擬機系統,選擇新建立的
Entry
,並且按F8
選擇禁用強制簽名。 - 如果順利,調試器會自動彈出並連接到被調試系統(因為
Start debugger automatically
默認是勾選狀態)。 - 如果調試器沒自動彈出,或者我們意外的關閉了調試器,我們可以通過點擊
Run Debugger
按鈕,手動啟動調試器。
整個過程,非常簡單。具體過程錄屏如下:

windbg 符號路徑設置
當我們執行一些命令的時候(比如,!thread
),需要符號文件的幫助。我們可以通過 _NT_SYMBOL_PATH
環境變量設置符號路徑。如果還沒有設置,可以在 windbg
中執行 .symfix path/to/symbol_cache
自動設置微軟符號服務器為上游符號服務器。當需要符號時,windbg
會先到 path/to/symbol_cache
中查找符號,如果找不到,會繼續到微軟符號服務器上查找,如果在微軟符號服務器上找到了,會緩存到 path/to/symbol_cache
,然后從 path/to/symbol_cache
加載符號。
溫馨提示:
.symfix
命令會刪除windbg
中現有的符號路徑設置。- 目前,好像需要ke xue上網才能成功連接微軟符號服務器。
總結
-
使用
VMware
前,最好禁用Hyper-V
,禁用Security Boot
,開啟Intel VT-x
。 -
一定要注意,
VMware
默認帶的打印機會占用串口 1
,如果不刪除打印機就新建串口的話,新建的串口是串口 2
。 -
VirtualKD3.0
還不支持VMware15.5
,我們可以使用VirtualKD-Redux
。 -
執行
.symfix path/to/symbol_cache
使用微軟符號服務器。
參考資料
VirtualKD official install tutorial