软件调试学习摘录
摘錄自 張銀奎《軟件調試》
17 WHEA
Windows中用于處理硬件錯誤的基本框架,它定義了系統中的硬件、固件,以及軟件應該如何相互協作來報告、處理和記錄各種硬件錯誤。WHEA之前,Windows系統對硬件錯誤的最典型處理方法就是立即發起Bug Check,即藍屏崩潰BSOD。
固件層、硬件抽象層、內核、驅動程序,都有WHEA的部件。
PSHED是Windows Vista為了實現WHEA而引進的一個內核模塊(DLL),其作用是與固件中的硬件錯誤處理腳本和代碼相交互。
WHEA輸出的函數可以:錯誤恢復,發起藍屏,清除錯誤記錄,將錯誤記錄填寫完整、或增加補充信息,枚舉所有錯誤源,讀取錯誤源信息,初始化,讀取錯誤信息,讀取錯誤記錄,保存錯誤記錄、即錯誤記錄持久化。
AER(Advanced Error Reporting)是PCI Express總線定義的一種高級的錯誤報告方式。
WHEA處理硬件錯誤的過程:LLHEH通過輪詢或接收到系統通知或中斷而感知到錯誤,然后調用PSHED的函數讀取錯誤信息,而后根據錯誤的嚴重程度采取處理措施。
必須借助一定的數據結構來共享信息,一個是WHEA_ERROR_PACKET,一個是WHEA_ERROR_RECORD。
錯誤持久化就是將錯誤信息記錄到可長久保存的介質中。大多數情況使用磁盤。但有時會磁盤故障。WHEA設計了一種方式,要求系統固件提供一個接口,操作系統可以調用這個接口將錯誤信息保存到系統的NVRAM中。
ERST,Error Record Serialization Table,即錯誤記錄序列化表。它是ACPI標準3.10b版本引入的用來支持WHEA的一個系統描述表。
為了測試WHEA的各個模塊和系統對WHEA的支持情況,WHEA定義了一種模擬產生硬件錯誤的方法,稱為錯誤注入Error Injection。
25 調試符號
調試符號是將被調試程序的二進制信息與源程序信息聯系起來的橋梁。
這些信息以表格的形式記錄在符號表中,是對源程序的概括。
調試符號既可以存儲在單獨的文件中,也可以與目標代碼共享一個文件。
PDB是Program Database的縮寫。
微軟提供了兩種方式來訪問調試符號文件中的符號,一種是DbgHelp函數庫,一種是DIA SDK(Debug?
Interface Access Software Development Kit)。
VC編譯器,修飾名稱,Decorated Name,將函數的本來名稱、調用協議、返回值等信息按照一定的規則
編排成一個新的名字。
以下兩行分別是TestTry函數的原型和它的修飾名稱:
int TestTry(HWND hWnd, int n)
?TestTry@@YAHPAUHWND__@@H@Z
設置編譯器的/FA選項使其輸出匯編文件。
對于void__cdecl test(void)函數,按照C規范編譯產生的修飾名稱是_test,按照C++規范編譯產生的修
飾名稱是?test@@ZAXXZ。
C++的修飾名稱都是以問號開始的。
因為COFF可以存儲各種數據對象,人們很自然想到用它來存儲調試信息。
WinDBG的lm命令在顯示模塊列表時會顯示每個模塊所使用的符號文件信息。
使用rebase工具可以將exe文件中的調試信息剝離到一個單獨的.dbg文件中。
CodeView是與MSC編譯器一起使用的調試器,它使用的調試符號格式被稱為CodeView格式,簡稱CV格式。
CV是微軟自己定義的調試符號存儲格式。
Borland公司的編譯器和調試器所使用的調試信息格式與CodeView格式類似,但做了一些擴展,典型的版
本簽名有FB09和FB0A。
根據所包含符號的完整程度,PDB格式的調試符號文件又分為私有Private和公共Public。
私有是由編譯器和鏈接器產生的,公共是在私有的基礎上使用工具產生的,公共剔除了與源程序文件關
系密切的私有信息。
使用DDK中的binplace工具可以成批地產生公共PDB文件。
VC2005或更高,可使用鏈接選項/PDBSTRIPPED:<公共PDB文件名>來產生公共PDB文件。
DWARF是一種公開的調試信息格式規范,是由DWARF組織定義的;主要用在Unix和Linux中,gcc和gdb都支
持DWARF格式。
VC編譯器的目標文件使用的是COFF格式,整個文件分成多個數據塊。
行號信息用來描述源代碼行與目標代碼的對應關系。
每條源代碼行信息是一個IMAGE_LINENUMBER結構。
PE規范定義了4種用于存儲調試數據的節。
使用DumpBin工具可以列出目標文件符號表中所包含的所有符號。
根據調試目錄結構中的信息可以找到各個調試數據塊;其方法就是將PointerToRawData字段所指定的文
件偏移加上PE模塊的基地址。
PDB簽名是一個可讀的字符串,其長度不固定,但是一定以0x1A結束。在ASCII中,0x1A即EOF(End Of?
File)。
一個典型PDB文件包含6種數據表:符號表,源文件表,節貢獻表,段信息表,注入代碼表,幀數據表。
總結
- 上一篇: 图解VC++版PE文件解析器源码分析
- 下一篇: IOS可执行文件学习总结