天天看點

VirtualKD加速windbg雙機調試速度

    原文的标題是:VirtualKD + VMWare實作單機核心調試。我覺得不是很妥當,畢竟雙機調試是OS自己實作的,不依賴VirtualKD,是以就改成了這個标題。不過出于對作者的尊重,正文中我還是會使用他的标題。不過,不得不佩服作者的文筆真的不錯,寫的很清晰。

​​VirtualKD + VMWare實作單機核心調試​​

 VirtualKD + VMWare實作單機核心調試

 By 張佩

        若幹年以前,我的前同僚酒若v霖(JIURL)寫的《​​借助VMware實作單機使用WinDbg​​》一文,幫助了很多人,至今流傳甚廣。它介紹了如何借助于VMWare虛拟機,在同一台電腦上使用Windbg調試軟體,實作核心“雙機”調試。這種技術,使用命名管道對實體序列槽進行模拟,讓虛拟機系統感覺自己是通過實體序列槽,在和主機通信。下圖是它的實作原理:

圖1虛拟機序列槽調試原理

         筆者一度也用過序列槽進行雙機調試,感覺就是一個字:慢!序列槽的傳輸速度稱為波特率。在目前語境下,可以把波特率等同于比特率。我發現,系統能夠支援的最大序列槽波特率,是115200。這個數字看上去就不大,換算一下大概是14400位元組/秒,或者14K/秒。另一種雙機連接配接方式,1394連接配接,它平均傳輸速度能達到10M/秒。二者一相比較,有若幹個數量級之差。

         讀者可能會提一個問題:用命名管道模拟的序列槽,也必須受制于波特率嗎?

 命名管道,而且是本機傳輸,其速度一定是非常快的。但圖1中,在虛拟機系統裡面,我們看到有一個“序列槽核心調試子產品(KDCOM)”,它會對波特率進行判斷。發覺波特率不比對的情況下,資料将被抛棄。是以命名管道是“被迫”降速!

          如果能把序列槽核心調試子產品換掉的話,就好了!本文介紹的VirtualKD軟體,就是這樣實作的一個産品。下面詳細介紹。

 請從此位址下載下傳最新的VirtualKD安裝包:​​http://virtualkd.sysprogs.org/​​

 作為一款免費軟體,做得如此好。有閑的朋友在沒事的時候,可以考慮給他們捐一點銀兩。如果大多數人都能習慣于慷十元之慨(尤其在中國),自由軟體和開源軟體的狀況,會很不一樣。謝謝。

          下載下傳後安裝(其實是解壓),打開安裝目錄,看到有一個名為Target的檔案夾。請在此時打開你要調試的目标虛拟機系統,把Target檔案夾拷貝過去,運作此檔案夾裡面的VMInstall.exe程式。這個程式的運作界面如圖2所示。

圖2添加啟動項

程式VMInstall做了兩件事,先說其一:添加啟動項。

        這個程式很智能,可以發現你的目前系統平台,建立一個啟動項,并起一個描述名。如果沒有異議,直接點Install即可。安裝完成後,我們最好打開系統配置程式檢視一下:

圖3确認新增啟動項

         如果是XP及以前的系統,可以打開C:/boot.ini檔案檢視其啟動項的完整設定。應該是類似下面的内容:

multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Windows XP [VirtualKD]" /DEBUG /DEBUGPORT=vm /fastdetect /NoExecute=OptIn

請務必注意到粗體部分内容:/debugport=VM。它的調試端口是“VM”。這個調試端口系統肯定不承認,是VirtualKD自定義的。嵌入到VMWare軟體中的相關子產品,通過它來判斷它是不是一個需要由自己來處理的系統。

         如果是Vista及以後的系統,應該用BcdEdit指令來檢視新啟動項。應該看到類似下面的内容:

Windows 啟動加載器-------------------辨別符 {default}device partition=E:path /Windows/system32/winload.exedescription Windows 7 [VirtualKD]recoveryenabled Yestestsigning Yesosdevice partition=E:systemroot /Windowsdbgtransport kdvm.dllresumeobject {331ebcfd-736a-11de-a22b-8e8ebafcd1d7}nx OptIncustom:26000027 Yesdebug Yes

這裡面有兩項是比較特殊的:testSigning和dbgtransport。前者标記系統中有未簽名的驅動,讓系統正常加載,在64位系統上所有的驅動都必須通過數字簽名,否則拒絕加載,本軟體包中的驅動檔案顯然沒有這樣做;後者則是一個用來替代圖1中序列槽子產品的核心調試子產品(KDCOM.dll),這個子產品顯然可以自定義,第三方可以用自己的類似子產品替代它。

         不管是什麼系統,這些陌生的啟動項,都自己添加了一些莫名其妙的選項值,是VirtulKD系統獨有的,而正常系統不可識别。是以不可以在自己的主機上添加這樣的啟動項,筆者好事試過,結果是通過這些啟動項,無法進入系統。

         回頭再說VMInstall做的第二件事。它把一個名為DDKLaunchMonitor.exe的程式釋放到系統根目錄下,并把它設定為系統啟動程式。它在系統資料庫鍵HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Run中添加一個DDKLaunchMonitor值來實作開機啟動。這個程式運作界面如圖4所示,圖中的文字資訊很清楚地表明,它正在幹什麼——監控來自主機的連接配接請求。

圖4目标機運作DDKLaunchMonitor程式監控調試連接配接

         安裝好DDKLaunchMonitor後,會提示系統重新開機,請按要求重新開機。重新開機的時候,預設以建立的啟動項進入系統,亦請照辦。

現在讓我們回到主機端,仍打開安裝目錄,看到名為VMMon.exe和VMMon64.exe的程式。前者用于32位系統,後者用于64位系統。運作它,軟體界面如下:

圖5主機端監控

此程式的作用是在主機端監控VMWare中運作的虛拟機系統。圖5上半部分,它監控到了一個系統。它非常可心地,把所監控到的VMWare程序、系統CPU占用率等詳細資訊都列了出來。

此時選中要調試的目标系統,在右下角點選Run Debugger按鈕,啟動核心調試器。如果你是首次運作,需要先點選此按鈕左邊一點的Debugger

Path…按鈕,以設定調試器路徑。預設受支援的調試器有Windbg和KD兩種,還可以用Custom選項設定自定義調試器。本文預設用Windbg調試器。不出意外,我們會看到Windbg自動開啟,并跳出下面的界面:

圖6 Windbg開始調試

從提示資訊看出,Windbg已經打開了命名管道。此時按下CTRL+Break組合鍵,就能建立連接配接了。速度會非常快哦!

開發VirtualKD的同一個組織,還開發了一款名叫VisualDDK的産品。後者把VirtualKD包含在内,又添加了一個新功能。這個新功能也非常炫,它通過插件形式,為Visual

Studio添加一個項目向導,通過這個項目向導,能建立一個WDM工程,并為這個建立的WDM工程自動添加百餘行代碼,這些代碼非常幹淨,筆者很喜歡。

繼續閱讀