1. 程式人生 > >(整理+原創)windbg+vmware進行驅動原始碼除錯 轉

(整理+原創)windbg+vmware進行驅動原始碼除錯 轉

一般情況下驅動是不能進行源程式碼級別的除錯的,原因是驅動程式碼都是執行在核心模式,所以要進行原始碼級除錯的話,需要雙機(一臺除錯機(可以是虛擬機器)一臺主機),當主機進行除錯的時候,除錯機整個暫停執行



網上的教程說的不清楚,整理了個,免得以後要用找不到 




一.安裝檔案:(這些換成你自己的路徑,不一定要一樣的)
VMware 安裝路徑:C:\Program Files\VMware\VMware Workstation
Symbols(程式碼庫) 安裝路徑:D:\tools\Symbols
WinDbg 安裝路徑:C:\Program Files\Debugging Tools for Windows\windbg.exe
虛擬Xp 安裝路徑:E:\vmxp(記住windbg是安裝在主機上,安裝在虛擬機器上是不能進行原始碼除錯的)
驅動程式碼所在位置:D:\Sfilter\sys (驅動原始碼,包括sourcer、sys、pdb、inf、c/c++等) 驅動要安裝在虛擬機器,原始碼等要放在主機上 

VMware中的工具:開啟VMware中的VM選單-》Install VMware tools 

二.安裝VMware,在安裝winXp並進行以下配置,可以在window下對虛擬機器除錯: 

1.在VMware的WinXp目錄(E:\vmxp)下找到winxppro.vmx檔案,加入以下的語句,為提高效率。(這個不是必要的)
vmmouse.present = "FALSE" 
svga.maxFullscreenRefreshTick = "5" 

2.在VMware的WinXp中新增串列埠裝置Serial Port(開啟VMware選擇WinXp進行操作(非常重要,不要遺漏了)
\\.\pipe\com_1
This end is the server
The other end is a virtul machine 

Advanced Yield CPU on poll 要選中 


3.在WinDbg的快捷方式點右鍵-->屬性-->目標 中加入(主機安裝完windbg時候在桌面上新建快捷方式,右鍵屬性) 
"C:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:port=\\.\pipe\com_1,baud=11520,pipe 


4.啟動VMware的WinXp,在它的c:\boot.ini檔案中加入(這個是隱藏檔案)
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug /debugport=com1 /baudrate=115200 


5.在本機上加“系統環境變數”(這個沒有必要,只要你有下載symbol程式碼庫就行了,可以跳過) 
_NT_SYMBOL_PATH
SRV*e:\symbols*
http://msdl.microsoft.com/download/symbols
;D:\tools\Symbols 


三.執行步驟:
1.啟動WinDbg(這個不要點選新建的那個快捷方式,從開始選單執行,試試就知道了) 
(1)載入Symbol的路徑(選單File-->Symbol File Path D:\tools\Symbols;D:\Sfilter\sys\objchk\i386)(選單File-->Symbol File Path 點選browse 新增第一個是你安裝的程式碼庫的路徑,當你安裝程式碼庫的時候你會看見路徑,找到新增即可,第二詞點選browse新增你驅動程式碼的生成檔案路徑,找到你驅動的資料夾即可,最後一層一定是i386) 
(2)載入Source的路徑(選單File-->Source File Path D:\Sfilter\sys\)(這個是你驅動原始碼的路徑) 
(3)載入ImagePath路徑(選單File-->Image File Path D:\Sfilter\sys\objchk\i386)(和(1)步中的第二個路徑是一樣的) 

2.啟動虛擬機器,選擇debug



這時候虛擬機器會暫停執行,在windbg裡面輸入g虛擬機器會全速執行,如果你想除錯驅動程式碼的話,可以點選windbg的暫停按鈕,在命令視窗輸入 bp 函式名 ,比如     

bp TdiFuncs_Send  即可,然後輸入g 

此時虛擬機器會全速執行,直到你在虛擬機器裡面安裝該驅動,當驅動執行至TdiFuncs_Send函式時整個虛擬機器便會暫停執行,此時整個虛擬機器隨你蹂躪

你可以檢視變數什麼的,和其他偵錯程式差不多,但是驅動除錯就是比較麻煩,



四.在winDbg中常用的命令(更多命令請查閱幫助)
下斷點:bp 地址 也可 bp 函式名
列出斷點:bl
清除斷點:bc 斷點號

禁用斷點:bd 斷點號 

使能斷點:be 斷點號 

重新載入:.reload 

列出符號庫: lm


載入符號庫:ld 

看結構體:dt 〔結構體〕



寫驅動容易引起藍屏的,最經常的原因是指標指向未初始化的變數!!出錯即死,沒得商量

如果你是使用irptrace、drivermonitor等來檢視除錯資訊的話,藍屏就看不到了,

不過當電腦藍屏時候,會將資訊壓入一個轉儲檔案中,關於轉儲檔案不清楚的去baidu一下,如果你有進行雙機除錯的經驗的話,利用dump檔案來查看出錯函式是很方便地。。。

先把藍屏的電腦重啟(一般他自己就重啟了),找到dump檔案(找不到的search一下),複製
到主機上(驅動程式碼一般在虛擬機器調,所以杯具的都是虛擬機器),開始選單執行windbg,file—>open crash dump 開啟即可哈(注意前面的 三.執行步驟: 改需要的程式碼庫還是需要的 要不然檢視不了).