1 調試驅動
WinDbg是調試Windows Driver的重要工具。要想進行調試,必須選擇一種Host和Target的連接方式,我這裏選擇的是串口連接,使用串口線將Host和Target連接起來。
1.1 準備一個例子
之前做過AVStream的相關項目,我們就編譯一個WDK中AVStreame的例子,啓動x86 Checked Build Environment,進入\7600.16385.0\src\AVStream\avshws目錄,敲入”build -ceZg”,編譯通過則例子就準備好了。
1.2 設置Target
首先拷貝一份啓動項,在命令行下執行”bcdedit /copy {Current} /d {MyDebug}”。然後使用msconfig配置啓動項,運行msconfig打開System Configuration,進入Boot,選擇MyDebug,進入Advancedoptions,勾選Debug,Debug port, Baud rate設置爲115200,點擊OK退出,將MyDebug設置爲default啓動項。這樣系統就會以Debug模式啓動了。
將編譯後的avshws.sys及avshws.inf拷貝到Target,通過Device Manager安裝驅動。打開DeviceManager->Add Hardware->Install the hardware that I manually select from alist (Advanced),選擇Sound, video and gamecontrollers,然後從Hard Disk找到相應的inf文件,安裝即可。
由於avshws是一個AVStream的fitler,可以通過GraphEdit來使用,在GraphEdit->Graph->InsertFilters->WDM Streaming Capture Devices下可以找到avshws Source這個filter,加入到graph,右鍵點擊Capture,然後Render Pin,這個Garph就創建好了,點擊Play可以切換到Play狀態。Target側的準備工作就好了,下面我們來設置Host。
1.3 設置Host
運行WinDbg,File->Kernel Debug,如下設置,其中com口依據實際情況進行設置:
點擊OK,從新啓動Target,帶系統啓動之後應該可以考到WinDbg已經連接到Target了,然後設置正確的File->SymbolFile Path(即pdb所在目錄)和File->Source FilePath,使用Ctrl+Break可以使WinDbg進入Break狀態,在Break狀態可以進行斷點的設置,查看變量的情況等,就和普通的IDE沒有什麼區別了。設置幾個斷點,然後運行Target上的Graph看看是否可以斷下來。
1.4 斷點的設定(bp,ba)
在kd>命令行下可以使用命令進行斷點設置。
bp, 之前只作爲普通的斷點使用,其實它可以更強大一些,完整命令如下:
bp[ID] [Options] [Address [Passes]]["CommandString"]
我們可以設置斷點hit多少次之後停下來,例如:bp moudle!function+0x1a510 , 斷點hit 10次後停下來。
也可以設置爲斷點hit之後打印一段話不停下來,例如:bp module!function +0x1a5".echo run to here; g" ,打印run to here,不斷下來.
也可以打印某個變量的值,例如:bp moudule!function+0x1a5 "dt mystruct;.echo mystructin module; g" , 打印mystruct變量的數據,一個結構的各個成員將被打印.
ba, 某個地址被訪問之後斷點起作用,這種斷點對於某些莫名的內存問題的調試非常有用,完整命令如下:
ba[ID] Access Size [Options] [Address[Passes]] ["CommandString"]
可以設置某個地址被寫就斷下來,例如:mystruct->parm1的地址爲0x9bf116b9, 可以設置 ba w1 0x9bf116b9 ,即當mystruct->parm1被寫時就會斷下來.
2 調試應用程序及DLL
使用WinDbg調試應用程序和DLL可以避免在Target安裝龐大的IDE,只要把編譯好的工程整體拷貝到Target,運行WinDbg,File->Attach to aProcess(可以調試DLL,Attach一個DLL的調用者) 或者 File->OpenExecutable,然後設置正確的Symbol path和Source Path即可,很方便。