圖書信息
作者:張銀奎 著出版社:電子工業出版社

出版時間:2008-6-1
字數:1200000
頁數:1006
開本:16開
ISBN:9787121064074
分類:圖書>>計算機/網路>>軟體工程/開發項目管理
定價:¥128.00
編輯推薦
ACM院士和調試技術先驅JackB.Dennis教授做歷史回顧計算機和作業系統領域資深專家DavidA.Solomon撰寫序言。調試高手筆耕三載集十餘年經驗成百萬言篇,業內專家鼎力相助,匯五十年精華補軟體界空白。您將學習到:
CPU的調試支持,包括異常、斷點、單步執行、分支監視、JTAG、MCE等。
Windows作業系統中的調試設施,包括核心調試引擎、用戶態調試予系統、驗證器、Dr.Watson、WER、ETW、故障轉儲、WHEA等。
VisualC/C++編譯器的調試支持,包括編譯期檢查、運行期檢查,以及調試符號。
WinDBG調試器的發展歷史、模組結構、工作模型、使用方法、主要調試功能的實現細節,以及遍布全書的套用實例。
核心調試、用戶態調試、JIT調試、遠程調試的原理、實現和用法。異常的概念、分發方法、處理方法(SEH、VEH、CppEH),未處理異常,以及編譯器編譯異常處理代碼的方法。
調試符號的作用、產生過程、存儲格式和使用方法。棧和堆的結構布局、工作原理和有關的軟體問題,包括棧的自動增長和溢出,緩;中區溢出,溢出攻擊,記憶體泄漏,堆崩潰等。
軟體的可調試性和提高可調試性的方法。
此外,書中還詮釋了很多較難理解的概念,思考了一系列耐人深思和具有普遍意義的問題。本書是對軟體調試技術在過去50年中所取得成就的全面展示,也是筆者本人在軟體設計和系統開發第一線奮戰10多年的經驗總結。本書適合每一位希望深刻理解軟體和自由駕馭軟體的人閱讀,不論您是否直接參與軟體開發和測試;不論您是熱愛軟體,還是憎恨軟體;不論您是想發現軟體中的瑕疵,還是想領略其中蘊含的智慧!
本書直面軟體工程中的最困難任務——偵錯
圍繞軟體世界中的最強大工具——調試器
全方位展示了軟體調試技術的無比威力和無窮魅力
80個示例程式的源程式檔案和項目檔案
瀏覽符號檔案的SymView工具
與核心調試引擎對話的KdTalker工具
直接瀏覽用戶態轉儲檔案的UdmpView工具
顯示CPU執行軌跡(分支)的Cpuwhere工具
觀察IDT、GDT和系統對象的SOZOOmer工具
本書是對軟體調試技術在過去50年中所取得成就的全面展示,也是對作者本人在軟體設計和系統開發第一線奮戰10多年的經驗總結。全書共分6篇30章,選取了大量具有代表性和普遍意義的技術細節進行討論,包括CPU的調試支持、作業系統的調試支持、編譯器的調試支持、WinDBG及其實現等,是學習軟體調試技術的寶貴資料。該書可供各大專院校作為教材使用,也可供從事相關工作的人員作為參考用書使用。
內容簡介
圍繞如何實現高效調試這一主題,本書深入系統地介紹了以調試器為核心的各種軟體調試技術。本書共30章,分為6篇。第1篇介紹了軟體調試的概況和簡要歷史。第2篇以英特爾架構(IA)的CPU為例,介紹了計算機系統的硬體核心所提供的調試支持,包括異常、斷點指令、單步執行標誌、分支監視、JTAG和MCE等。第3篇以Windows作業系統為例,介紹了計算機系統的軟體核心中的調試設施,包括核心調試引擎、用戶態調試子系統、異常處理、驗證器、錯誤報告、事件追蹤、故障轉儲、硬體錯誤處理等。第4篇以VisualC/C++編譯器為例,介紹了生產軟體的主要工具的調試支持,重點討論了編譯期檢查、運行期檢查及調試符號。第5篇討論了軟體的可調試性,探討了如何在軟體架構設計和軟體開發過程中加入調試支持,使軟體更容易被調試。在前5篇內容的基礎上,第6篇首先介紹了調試器的發展歷史、典型功能和實現方法,然後全面介紹了WinDBG調試器,包括它的模組結構、工作模型、使用方法和主要調試功能的實現細節。本書是對軟體調試技術在過去50年中所取得成就的全面展示,也是對作者本人在軟體設計和系統開發第一線奮戰10多年的經驗總結。本書理論與實踐緊密結合,選取了大量具有代表性和普遍意義的技術細節進行討論,是學習軟體調試技術的寶貴資料,適合每一位希望深刻理解軟體和自由駕馭軟體的人閱讀,特別是從事軟體開發、測試、支持的技術人員和有關的研究人員。
圖書目錄
第1篇緒論第1章軟體調試基礎
1.1簡介
1.2基本特徵
1.3簡要歷史
1.4分類
1.5調試技術概覽
1.6錯誤與缺欠
1.7與軟體工程的關係
1.8本章總結
第2篇CPU的調試支持
第2章CPU基礎
2.1指令和指令集
2.2IA-32處理器
2.3CPU的操作模式
2.4暫存器
2.5理解保護模式
2.6段機制
2.7分頁機制(Paging)
2.8系統概貌
2.9本章總結
第3章中斷和異常
3.1概念和差異
3.2異常的分類
3.3異常例析
3.4中斷/異常優先權
3.5中斷/異常處理
3.6本章總結
第4章斷點和單步執行
4.1軟體斷點
4.2硬體斷點
4.3陷阱標誌
4.4實模式調試器例析
4.5本章總結
第5章分支記錄和性能監視
5.1分支監視概覽
5.2使用暫存器的分支記錄
5.3使用記憶體的分支記錄
5.4DS示例:CpuWhere
5.5性能監視
5.6本章總結
第6章機器檢查架構(MCA)
6.1奔騰處理器的機器檢查機制
6.2MCA
6.3編寫MCA軟體
6.4本章總結
第7章JTAG調試
7.1簡介
7.2JTAG原理
7.3JTAG套用
7.4IA-32處理器的JTAG支持
7.5本章總結
第3篇作業系統的調試支持
第8章Windows概要
8.1簡介
8.2進程和進程空間
8.3核心模式和用戶模式
8.4架構和系統部件
8.5本章總結
第9章用戶態調試模型
9.1概覽
9.2採集調試訊息
9.3傳送調試訊息
9.4調試子系統伺服器(XP之後)
9.5調試子系統伺服器(XP之前)
9.6比較兩種模型
9.7NTDLL中的調試支持例程
9.8調試API224
9.9本章總結
第10章用戶態調試過程
10.1調試器進程
10.2被調試進程
10.3從調試器中啟動被調試程式
10.4附加到已經啟動的進程
10.5處理調試事件
10.6中斷到調試器
10.7輸出調試字元串
10.8終止調試會話
10.9本章總結
第11章中斷和異常管理
11.1中斷描述符表
11.2異常的描述和登記
11.3異常分發過程
11.4結構化異常處理(SEH)
11.5向量化異常處理(VEH)
11.6本章總結
第12章未處理異常和JIT調試
12.1簡介
12.2默認的異常處理器
12.3未處理異常過濾函式
12.4應用程式錯誤對話框
12.5JIT調試和Dr.Watson
12.6頂層異常過濾函式
12.7Dr.Watson
12.8DRWTSN32的日誌檔案
12.9用戶態轉儲檔案
12.10本章總結
第13章硬錯誤和藍屏
13.1硬錯誤提示
13.2藍屏終止(BSOD)
13.3系統轉儲檔案
13.4分析系統轉儲檔案
13.5輔助的錯誤提示方法
13.6配置錯誤提示機制
13.7防止濫用錯誤提示機制
13.8本章總結
第14章錯誤報告
14.1WER1.0
14.2系統錯誤報告
14.3WER伺服器端
14.4WER2.0
14.5CER
14.6本章總結
第15章日誌
15.1日誌簡介
15.2ELF的架構
15.3ELF的數據組織
15.4察看和使用ELF日誌
15.5CLFS的組成和原理
15.6CLFS的使用方法
15.7本章總結
第16章事件追蹤
16.1簡介
16.2ETW的架構
16.3提供ETW訊息
16.4控制ETW會話
16.5消耗ETW訊息
16.6格式描述
16.7NTKernelLogger
16.8GlobalLoggerSession
16.9CrimsonAPI
16.10本章總結
第17章WHEA
17.1目標和架構
17.2錯誤源
17.3錯誤處理過程
17.4錯誤持久化
17.5注入錯誤
17.6本章總結
第18章核心調試引擎
18.1概覽
18.2連線
18.3啟用
18.4初始化
18.5核心調試協定
18.6與核心互動
18.7建立和維持連線
18.8本地核心調試
18.9本章總結
第19章Windows的驗證機制
19.1簡介
19.2驅動驗證器的工作原理
19.3使用驅動驗證器
19.4應用程式驗證器的工作原理
19.5使用應用程式驗證器
19.6本章總結
第4篇編譯器的調試支持
第20章編譯和編譯期檢查
20.1程式的構建過程
20.2編譯
20.3VisualC++編譯器
20.4編譯錯誤和警告
20.5編譯期檢查
20.6標準標註語言
20.7本章總結
第21章運行庫和運行期檢查
21.1C/C++運行庫
21.2連結運行庫
21.3運行庫的初始化和清理
21.4運行期檢查
21.5報告運行期檢查錯誤
21.6本章總結
第22章棧和函式調用
22.1簡介
22.2棧的創建過程
22.3CALL和RET指令
22.4局部變數和棧幀
22.5幀指針省略(FPO)
22.6棧指針檢查
22.7調用協定
22.8棧空間的增長和溢出
22.9棧下溢
22.10緩衝區溢出
22.11變數檢查
22.12基於Cookie的安全檢查
22.13本章總結
第23章堆和堆檢查
23.1理解堆
23.2堆的創建和銷毀
23.3分配和釋放堆塊
23.4堆的內部結構
23.5低碎片堆(LFH)
23.6堆的調試支持
23.7棧回溯資料庫
23.8堆溢出和檢測
23.9頁堆
23.10準頁堆
23.11CRT堆
23.12CRT堆的調試堆塊
23.13CRT堆的調試功能
23.14堆塊轉儲
23.15泄漏轉儲
23.16本章總結
第24章異常處理代碼的編譯
24.1概覽
24.2FS:[0]鏈條
24.3遍歷FS:[0]鏈條
24.4執行異常處理函式
24.5__try{}__except()結構
24.6安全問題
24.7本章總結
第25章調試符號
25.1名稱修飾
25.2調試信息的存儲格式
25.3目標檔案中的調試信息
25.4PE檔案中的調試信息
25.5DBG檔案
25.6PDB檔案
25.7有關的編譯和連結選項
25.8PDB檔案中的數據表
25.9本章總結
第5篇可調試性
第26章可調試性概覽
26.1簡介
26.2Showstopper和未雨綢繆
26.3基本原則
26.4不可調試代碼
26.5可調試性例析
26.6與安全、性能和商業秘密的關係
26.7本章總結
第27章可調試性的實現
27.1角色和職責
27.2可調試架構
27.3通過棧回溯實現可追溯性
27.4數據的可追溯性
27.5可觀察性的實現
27.6自檢和自動報告
27.7本章總結
第6篇調試器
第28章調試器概覽
28.1TX-0計算機和FLIT調試器
28.2小型機和DDT調試器
28.3個人計算機和它的調試器
28.4調試器的功能
28.5分類標準
28.6實現模型
28.7經典架構
28.8HPD標準
28.9本章總結
第29章WinDBG及其實現
29.1WinDBG溯源
29.2C階段的架構
29.3重構
29.4調試器引擎的架構
29.5調試目標
29.6調試會話
29.7接收和處理命令
29.8本章總結
第30章WinDBG用法詳解
30.1工作空間
30.2命令概覽
30.3用戶界面
30.4輸入和執行命令
30.5建立調試會話
30.6終止調試會話
30.7理解上下文
30.8調試符號
30.9事件處理
30.10控制調試目標
30.11單步執行
30.12使用斷點
30.13控制進程和執行緒
30.14觀察棧
30.15分析記憶體
30.16遍歷鍊表
30.17調用目標程式的函式
30.18命令程式
30.19本章總結
附錄A示例程式列表
附錄BWinDBG標準命令列表
索引
圖書章節
第1篇緒論第1章軟體調試基礎
1955年,一個名叫ComputerUsageCorporation(CUC)的公司誕生了,它是世界上第一個專門從事軟體開發和服務的公司。CUC公司的創始人是ElmerKubie和JohnwSheldon,他們都在IBM工作過。從當時計算機硬體的迅速發展中,他們看到了軟體方面所潛在的機遇。CUC的誕生標誌著一個新興的產業正式起步了。
與其他產業相比,軟體產業的發展速度是驚人的。短短50幾年後,我們已經難以統計世界上共有多少個軟體公司,只知道一定是一個很龐大的數字,而且這個數量還在不斷增大。同時,軟體產品的數量也達到了難以統計的程度,各種各樣的軟體已經滲透到人類生產和生活的各個領域,越來越多的人開始依賴軟體工作和生活。
與傳統的產品相比,軟體產品具有根本的不同,其生產過程也有著根本的差異。在開發軟體的整個過程中,存在非常多的不確定性因素。在一個軟體真正完成之前,很難預計它的完成日期。很多軟體項目都經歷了多次的延期,還有很多中途夭折。直到今天,人們還沒有找到一種有效的方法來控制軟體的生產過程。導致軟體生產難以控制的根本原因是來源於軟體本身的複雜性。一個軟體的規模越大,它的複雜度也越高。
簡單來說,軟體是程式(program)和文檔(document)的集合,程式的核心內容便是按一定順序排列的一系列指令(instruction)。如果把每個指令看作一塊積木,那么軟體開發就是使用這些積木修建一個讓CPU(中央處理器)在其中運行的交通系統。這個系統中有很多條不同特徵的道路(函式)。有些道路只允許一輛車在上面行駛,一輛車駛出後另一輛才能進入,有些道路可以讓無數輛車同時在上面飛奔。這些道路都是單行道,只可以沿一個方向行駛。在這些道路之間,除了明確的入口(entry)和出口(exit)之外,還可以通過中斷和異常等機制從一條路飛越到另一條,另一條又可以飛轉到第三條或直接飛回到第一條。在這個系統中行駛的車輛也很特殊,它們速度很快,而且“無人駕駛”,完全不知道會跑到哪裡,唯一的原則就是上了一條路便沿著它向前跑……引
如果說軟體的執行過程就好像是CPU在無數條道路(指令流)間飛奔,那么開發軟體的過程就是設計和構建這個交通網路的過程。其基本目標是要讓CPU在這個網路中奔跑時可以完成需求(requirement)中所定義的功能。對這個網路的其他要求通常還有可靠(reliable)、靈活(flexible)、健壯(robust)、易於維護(maintainable),可以簡單地改造就能讓其他類型的車輛(CPU)在上面行駛(portable)……
開發一個滿足以上要求的軟體系統不是一件簡單的事,通常需要經歷分析(analysis)、設計(design)、編碼(code)和測試(test)等多個環節。通過測試並發布(release)後,還需要維護(maintain)和支持(support)工作。在以上環節中,每一步都可能遇到這樣那樣的技術難題。