如何使用WinDBG跟蹤調試ASL/ACPI?

如何使用WinDBG跟蹤調試ASL/ACPI?

 

去年在研究ACPI的時候我有用windbg來分析一下ACPI methods,當時配置windbg的時候參考了幾位前輩的文章,今天也轉其中一篇過來以做備份。原地址是:http://blog.csdn.net/EFIBIOS/archive/2007/03/12/1526763.aspx

 

 

在現代計算機中,硬件和固件(BIOS)都必須符合ACPI規範,以便操作系統可以控制所有模塊的自動配置和電源管理。 使用WinDbg調試ACPI代碼通常需要兩臺計算機,一臺是目標機(Debuggee),另一臺作爲主機(Debugger)。下面就介紹一下怎麼在兩臺機器上建立調試環境。
1、配置調試Debuggee的連接方式
Windbg支持COM、1394、USB2.0三種不同的連接方式,看到網上有些文章關於使用USB2.0來連接,需要購買特殊的USB調試線,而且價格不菲,本篇文章就不討論了。筆記本電腦一般都沒有COM端口,只好使用1394或是COM轉USB,但在這裏我只想討論怎麼使用COM端口來連接。

啓動到操作系統,使用bootcfg命令或直接使用文本編輯器修改boot.ini文件,指定調試使用的端口及參數。爲了使用COM端口來調試,需要在啓動參數中加入/debug參數,並指定/debugport和/baudrate子參數來作爲啓動項。下面這個boot.ini文件的第一個啓動項就是配置使用COM端口。/debugport子參數指出使用Debuggee的哪個COM口,/baudrate指出連接的速度(默認是每秒19200位)。

[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="Debugging with Cable" /fastdetect /debug /debugport=COM1 /baudrate=57600
multi(0)disk(0)rdisk(0)partition(1)/WINDOWS="Microsoft Windows XP Professional" /fastdetect

下面的例子使用bootcfg命令設置第一個啓動項使用COM1端口、波特率爲115200。bootcfg的/debug開關打開,/port開關及/baud參數指出端口和速度,/ID開關指出修改的是第一個啓動項。

bootcfg /debug ON /port COM1 /baud 115200 /ID 1

2、建立AML調試環境
AML調試器被包含在checked版(調試版)的acpi.sys中,爲了完全使用AML調試器,這個驅動必須要安裝在目標機上。儘管Free版(正式版)的acpi.sys支持一部分的AMLI debugger擴展命令,但它並沒有包含AMLI debugger。

如果你的目標機上已經安裝Windows的checked版,運行的就是checked版的acpi.sys。如果安裝的是free版的Windows,你可以選擇重新安裝一個完整的checked版或選擇只安裝checked版的acpi.sys。(肯定是後一種方式方便啊J),我會在另外一篇文章中講講怎麼在free版的Windows中安裝checked版的acpi.sys。

3、下載安裝Windbg
Windbg在微軟網站上有免費下載,http://www.microsoft.com/whdc/devtools/debugging/default.mspx,現在的版本是6.6.7.5。安裝它沒有什麼特別之處,如果你曾經在別的機器上安裝過,直接拷貝到你現在的機器上也能用。看到某些帖子說最好安裝路徑上不要有空格,可能會出問題,但我一直沒碰到過。

4、主機端符號(Symbol)文件路徑配置
首先,什麼是symbol文件呢?Symbol文件包含了很多調試DLL、EXE文件的時候需要的數據,但它們在程序運行的時候沒什麼用。通俗的說,Symbol File是包含了相關二進制文件(EXE,DLL)調試信息的一種文件,它以.pdb爲擴展名。比如Windows XP下有一個GDI32.dll,那麼微軟在編譯該DLL的時候會產生一個GDI32.pdb文件,程序員有了這個PDB文件,願意的話就可以用它來調試,跟蹤到GDI32.dll的內部去!一般來說,symbol文件包含一下內容:

a.全局變量(Global variables)
    b.局部變量(Local variables)
    c.函數名和它們的入口地址(Function names and the addresses of their entry points)
    d.FPO data(frame pointer omission),frame pointer是一種用來在調用堆棧(Call stack)中找到下一個將要被調用的函數的數據結構源代碼的行序號(Source-line numbers)

該文件和二進制文件的編譯版本密切相關,比如你修改了DLL的輸出函數等,再編譯該DLL那麼原先的PDB文件就過時了,不能再勝任調試的重擔了,這時候你需要的是修改後編譯產生的PDB文件。所以,主機端使用的Symbol文件一定要和目標機上安裝的操作系統的版本要一致。

Symbol文件對於Windbg來說是至關重要的,如果找不到正確的Symbol文件,調試功能就沒法使用。Windows的Symbol文件可以在微軟網站上免費下載,http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx。可我不建議您這麼做,因爲不管是Checked版的還是Free版的Symbol都有近200M,下載過程相當痛苦。好在微軟提供了Symbol服務器,使得Windbg可以自己在上面查找需要的模塊。具體配置方法是:File-〉Symbol File Path…彈出符號文件對話框,輸入:        SRV*C:/Symbols*http://msdl.microsoft.com/download/symbols,“C:/Symbols”可以是本地人一路徑,用來保存下載的符號文件。

5、聯機開始調試
A、啓動目標機,當啓動到啓動菜單的時候,移動方向鍵,結束倒數計時,使它停在這個地方。

B、在主機上打開Windbg,File-〉kernel Debug,選擇相應的連接方式,如果使用COM端口的話,在對話框中填寫主機使用的COM端口以及所選擇的波特率,波特率需要和目標機上的設置相同。

點擊OK就大功告成了,嘗試使用!amli debugger命令啓動AMLI調試器,如果沒什麼動靜,這就算成功了。開始調試你的ACPI代碼吧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章