本文的主要試用對象是Mac OS/Linux用戶,對於想調試windows內核相關的一些東西時,須要搭建雙機調試環境的一些記錄。另外對於本機是windows的用戶也徹底試用,windows搭建雙機環境是會更簡單一些,可是基本是同樣的。html
- VMware 15
- windows 7 x86 –> 調試機
- windows xp –> 被調試機1
- windws 7 x86 –> 被調試機2
- Ubuntu 18.04 –> 物理機
- windbg –> 調試器
環境搭建的核心主要在虛擬機的設置上,這塊設置好了,後面就會比較順利。shell
虛擬機的安裝在這裏就不在敘述,安裝好虛擬機之後,咱們打開virtual machine settings–>Add–>serial port–>finish
,以下圖所示windows
隨後咱們選擇Use socket(named pipe)
選項,這裏須要輸入一個文件的位置來作socket鏈接的轉儲,至關於調試信息轉存的中轉站,這裏只須要指定就能夠,稍後會自動在所設置目錄自動建立文件,我這裏是com1
文件,這裏須要特別說明一下,在設置虛擬機的串行端口指定com1
仍是com2
這取決於serial port的端口號
是幾,默認狀況下虛擬機添加了打印機 print
,因此此處默認端口爲2
,我在測試時使用com2
沒成功,刪除了虛擬機的打印機後,使用的com1端口
能夠成功。這臺虛擬機是xp,是做爲被調試機用的,因此咱們選擇server
,接着勾選I/O Mode
,使此虛擬機支持cpu中斷,以下圖所示服務器
接着設置調試機,基本和上面的設置同樣,區別是,此次是選擇client
,不勾選I/O Mode
選項,以下圖所示socket
Ok,到這裏虛擬機的設置就完成了,接下來是被調試機的設置,咱們打開被調試機測試
這裏先拿xp來講一下,windows7及以上的系統設置和xp略有不一樣,稍後會敘述.打開被調試機,win+R
鍵入c:\boot.ini
打開系統啓動配置.而後添加一行配置,以下命令行
[boot loader] timeout=30 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 debug" /debug /debugport=com1 /baudrate=115200 /fastdetect
這裏的debugport
須要和剛纔設置的文件的名字同樣,這裏也是指定咱們選中的串行接口。baudrate
默認爲115200
,而後ctrl+s保存,再次重啓就會多出一個支持調試的啓動選項.如圖debug
Windows Vista以後的系統,不在使用BOOT.INI
文件,改成了使用Coot Configuration Data
,其配置的原理也大同小異,下面以windows 7爲例子,作一個示範3d
C:\Windows\system32>bcdedit.exe /copy {current} /d "windows 7 Debug with Serial" #複製當前的啓動入口 已將該項成功複製到 {2bd58bb9-12d9-11eb-b328-b016eb5db92e}。 C:\Windows\system32>bcdedit.exe /debug {2bd58bb9-12d9-11eb-b328-b016eb5db92e} on #啓動入口啓動內核調試 操做成功完成。 C:\Windows\system32>bcdedit /dbgsettings serial DEBUGPORT:1 BAUDRATE:115200 #serial表示使用串口,對應上面xp的com1 操做成功完成。 C:\Windows\system32>bcdedit /dbgsettings #檢查上述的設置 debugtype Serial debugport 1 baudrate 115200 操做成功完成。 C:\Windows\system32>bcdedit #查看Windoes的啓動入口 Windows 啓動管理器 -------------------- 標識符 {bootmgr} device partition=C: description Windows Boot Manager locale zh-CN inherit {globalsettings} default {current} resumeobject {2bd58bb5-12d9-11eb-b328-b016eb5db92e} displayorder {current} {2bd58bb9-12d9-11eb-b328-b016eb5db92e} toolsdisplayorder {memdiag} timeout 30 Windows 啓動加載器 ------------------- 標識符 {current} device partition=C: path \Windows\system32\winload.exe description Windows 7 locale zh-CN inherit {bootloadersettings} recoverysequence {2bd58bb7-12d9-11eb-b328-b016eb5db92e} recoveryenabled Yes osdevice partition=C: systemroot \Windows resumeobject {2bd58bb5-12d9-11eb-b328-b016eb5db92e} nx OptIn Windows 啓動加載器 ------------------- 標識符 {2bd58bb9-12d9-11eb-b328-b016eb5db92e} device partition=C: path \Windows\system32\winload.exe description windows 7 Debug with Serial locale zh-CN inherit {bootloadersettings} recoverysequence {2bd58bb7-12d9-11eb-b328-b016eb5db92e} recoveryenabled Yes osdevice partition=C: systemroot \Windows resumeobject {2bd58bb5-12d9-11eb-b328-b016eb5db92e} nx OptIn debug Yes
打開調試機,安裝好windbg。隨後咱們複製一個新的桌面快捷方式,更名字(爲了區分原來的快捷方式),而後右鍵-->屬性-->目標
在後面添加-b -k com:port=1,baud=115200
圖片以下調試
這時咱們須要重啓被調試機,進入支持debug的啓動選項,這時咱們觀察windbg已經鏈接到了目標主機,以下圖
在內核調試下,按g
可以讓目標主機繼續運行,若是想讓目標中斷可選擇調試器的debug–>Break
選項,便可把控制權交還調試器,隨後咱們加載內核調試須要的符號表,首先須要調試機聯網,隨後在調試器鍵入ctrl+s
打開符號表路徑設置,輸入以下SRV*c:\symbols* https://msdl.microsoft.com/download/symbols
這裏的意思是告訴調試器,首先去c盤的symbols
目錄找符號表,若是找不到就聯網到微軟的符號表服務器遠程下載,下載的文件一樣會存到symbols
目錄方便下次使用.因此須要手動到c盤新建一個名字爲symbols的空文件夾.隨後在調試器的命令行輸入.reload /f
從新加載符號表,通常來講第一次都會聯網下載符號表的,下載過程當中因爲某些文件變化符號表已經不維護,因此會出現部分找不到的狀況,但基本影響不大,若是出現徹底不能下載的狀況,請參考以前的文章解決。下載好之後就能夠雙機調試了