關(guān)于我們
書單推薦
新書推薦
|
軟件調(diào)試 第2版 卷2 Windows平臺調(diào)試 上、下冊(異步圖書出品)
本書是國內(nèi)當前集中介紹軟件調(diào)試主題的權(quán)威著作。本書第2 卷分為5 篇,共30 章,主要圍繞Windows系統(tǒng)展開介紹。第一篇(第1~4 章)介紹Windows 系統(tǒng)簡史、進程和線程、架構(gòu)和系統(tǒng)部件,以及Windows系統(tǒng)的啟動過程,既從空間角度講述Windows 的軟件世界,也從時間角度描述Windows 世界的搭建過程。第二篇(第5~8 章)描述特殊的過程調(diào)用、墊片、托管世界和Linux 子系統(tǒng)。第三篇(第9~19 章)深入探討用戶態(tài)調(diào)試模型、用戶態(tài)調(diào)試過程、中斷和異常管理、未處理異常和JIT 調(diào)試、硬錯誤和藍屏、錯誤報告、日志、事件追蹤、WHEA、內(nèi)核調(diào)試引擎和驗證機制。第四篇(第20~25 章)從編譯和編譯期檢查、運行時庫和運行期檢查、棧和函數(shù)調(diào)用、堆和堆檢查、異常處理代碼的編譯、調(diào)試符號等方面概括編譯器的調(diào)試支持。第五篇(第26~30 章)首先縱覽調(diào)試器的發(fā)展歷史、工作模型和經(jīng)典架構(gòu),然后分別討論集成在Visual Studio 和Visual Studio(VS)Code 中的調(diào)試器,最后深度解析WinDBG 調(diào)試器的歷史、結(jié)構(gòu)和用法。
本書理論與實踐結(jié)合,不僅涵蓋了相關(guān)的技術(shù)背景知識,還深入研討了大量具有代表性的技術(shù)細節(jié),是學習軟件調(diào)試技術(shù)的珍貴資料。 本書適合所有從事軟件開發(fā)工作的讀者閱讀,特別適合從事軟件開發(fā)、測試和支持的技術(shù)人員閱讀。 1. 軟件調(diào)試領(lǐng)域的“百科全書”,圍繞軟件調(diào)試的“生態(tài)”系統(tǒng)(ecosystem)、異常(exception)和調(diào)試器三條主線,介紹軟件調(diào)試的相關(guān)原理和機制,探討可調(diào)試性(debuggability)的內(nèi)涵、意義,以及實現(xiàn)軟件可調(diào)試性的原則和方法,總結(jié)軟件調(diào)試的理論和最佳實踐; 2. 作者張銀奎是軟件調(diào)試領(lǐng)域資-深專家,國內(nèi)軟件調(diào)試技術(shù)專家; 3. 內(nèi)容全面:為了便于攜帶和閱讀,裝定為上、下兩冊; 4. 理論與實踐結(jié)合:不僅涵蓋了相關(guān)的技術(shù)背景知識,還深入研討了大量具有代表性的技術(shù)細節(jié); 5. 第2版新增了近幾年流行的開發(fā)環(huán)境等內(nèi)容; 6. 本書配套網(wǎng)站上提供示例程序的源代碼和編譯好的二進制文件。
張銀奎,國內(nèi)知名的調(diào)試技術(shù)專家。畢業(yè)于上海交通大學信息與控制工程系,長期從事軟件開發(fā)和研究工作,曾在英特爾工作13 年,對 IA-32 架構(gòu)、操作系統(tǒng)內(nèi)核、驅(qū)動程序,尤其是對軟件調(diào)試有較深入的研究。著有《軟件調(diào)試》《格蠹匯編》等暢銷、常銷技術(shù)圖書,格蠹科技(xedge.ai)創(chuàng)始人,高端調(diào)試網(wǎng)站(advdbg.org)創(chuàng)建者。翻譯(合譯)作品有《二十一世紀機器人》《觀止——微軟創(chuàng)建NT 和未來的奪命狂奔》《數(shù)據(jù)挖掘原理》《機器學習》《人工智能:復雜問題求解的結(jié)構(gòu)和策略》等。
第 一篇 大 局 觀
第 1 章 Windows 系統(tǒng)簡史 1.1 源于DOS 1.2 功在NT 1.3 Windows 2000 彰顯實力 1.4 巔峰之作:Windows XP 和Windows Server 2003 1.5 Windows Vista 折戟沙場 1.6 Windows 7 享利中興 1.7 Windows 8 革新受挫 1.8 Windows 10 何去何從 1.9 本章總結(jié) 17 參考資料 第 2 章 進程和線程 2.1 任務(wù) 2.2 進程資源 2.3 進程空間 2.3.1 32 位進程空間 2.3.2 64 位進程空間 2.4 EPROCESS 結(jié)構(gòu) 2.5 PEB.... 28 2.6 內(nèi)核模式和用戶模式 2.6.1 訪問模式 2.6.2 使用INT 2E 切換到內(nèi)核模式 2.6.3 快速系統(tǒng)調(diào)用 2.6.4 逆向調(diào)用 2.6.5 實例分析 2.7 線程 2.7.1 ETHREAD 2.7.2 TEB 2.8 WoW 進程 2.8.1 架構(gòu) 2.8.2 工作過程 2.8.3 注冊表重定向 2.8.4 注冊表反射 2.8.5 文件系統(tǒng)重定向 2.9 創(chuàng)建進程 2.10 最小進程和Pico 進程 2.10.1 最小進程 2.10.2 Pico進程 2.11 任務(wù)管理器 2.12 本章總結(jié) 參考資料 第3 章 架構(gòu)和系統(tǒng)部件 3.1 系統(tǒng)概覽 3.1.1 內(nèi)核空間 3.1.2 用戶空間 3.2 內(nèi)核和HAL 模塊 3.2.1 內(nèi)核文件 3.2.2 HAL文件 3.3 空閑進程 3.4 系統(tǒng)進程 3.5 內(nèi)核空間的其他模塊 3.6 NTDLL.DLL 3.6.1 角色 3.6.2 調(diào)用系統(tǒng)服務(wù)的樁函數(shù) 3.6.3 映像文件加載器 3.6.4 運行時庫 3.6.5 其他功能 3.7 環(huán)境子系統(tǒng) 3.8 原生進程 3.8.1 特點 3.8.2 SMSS 3.8.3 CSRSS 3.9 本章總結(jié) 參考資料 第4 章 啟動過程 4.1 BootMgr 4.1.1 工作過程 4.1.2 調(diào)試方法 4.2 WinLoad 4.3 內(nèi)核初始化 4.3.1 NT 的入口函數(shù) 4.3.2 內(nèi)核初始化 4.4 執(zhí)行體的階段0 初始化 4.4.1 總體過程 4.4.2 創(chuàng)建特殊進程 4.5 執(zhí)行體的階段1 初始化 4.5.1 Phase1Initialization 4.5.2 喚醒其他CPU 4.5.3 非啟動CPU 的起步路線 4.5.4 漫長的I/O 初始化 4.5.5 更新進度 4.6 創(chuàng)建用戶空間 4.6.1 創(chuàng)建會話管理器進程 4.6.2 建立環(huán)境子系統(tǒng) 4.6.3 創(chuàng)建窗口站和桌面 4.6.4 用戶登錄 4.7 本章總結(jié) 參考資料 第二篇 探 微 第5 章 特殊的過程調(diào)用 5.1 異步過程調(diào)用 5.2 中斷請求級別 5.2.1 設(shè)計初衷 5.2.2 基本原理 5.2.3 析疑 5.3 延遲過程調(diào)用 5.3.1 使用模式 5.3.2 黏滯在DPC 5.4 本地過程調(diào)用 5.5 遠程過程調(diào)用 5.5.1 工作模型 5.5.2 RPC 子系統(tǒng)服務(wù) 5.5.3 端點和協(xié)議串 5.5.4 蜂巢 5.5.5 案例和調(diào)試方法 5.6 本章總結(jié) 參考資料 第6 章 墊片 6.1 墊片數(shù)據(jù)庫 6.1.1 認識SDB文件 6.1.2 定制的SDB文件 6.1.3 修補模式 6.2 AppHelp 6.2.1 SDB 功能 6.2.2 墊片引擎 6.2.3 AD 掛鉤 6.2.4 穿山甲掛鉤 6.3 墊片動態(tài)庫 6.3.1 AcLayers.DLL 6.3.2 AcGenral.DLL 和AcSpecfc.DLL 6.3.3 其他墊片模塊 6.4 應(yīng)用程序墊片的工作過程 6.4.1 在父進程中準備墊片數(shù)據(jù) 6.4.2 在新進程中加載和初始化墊片引擎 6.4.3 加載墊片模塊 6.4.4 落實掛鉤 6.4.5 執(zhí)行墊片 6.5 內(nèi)核墊片引擎 6.5.1 數(shù)據(jù)和配置 6.5.2 初始化 6.5.3 KSE 墊片結(jié)構(gòu) 6.5.4 注冊墊片 6.5.5 部署墊片 6.5.6 執(zhí)行墊片 6.6 本章總結(jié) 參考資料 第7 章 托管世界 7.1 簡要歷史 7.2 宏偉藍圖 7.3 類和方法表 7.4 輔助調(diào)試線程 7.4.1 托管調(diào)試模型 7.4.2 RCThread 7.4.3 刺探線程 7.5 CLR4 的調(diào)試模型重構(gòu) 7.6 SOS 擴展 7.6.1 加載SOS 7.6.2 設(shè)置斷點 7.6.3 簡要原理 7.7 本章總結(jié) 參考資料 第8 章 Linux子系統(tǒng) 8.1 源于Drawbridge 8.2 融入NT 8.3 總體架構(gòu) 8.4 子系統(tǒng)內(nèi)核模塊 8.5 微軟版Linux 內(nèi)核 8.6 Linux 子系統(tǒng)服務(wù)器 8.7 WSL 啟動器 8.8 交叉開發(fā) 8.9 WSL2 8.10 本章總結(jié) 參考資料 第三篇 操作系統(tǒng)的調(diào)試支持 第9 章 用戶態(tài)調(diào)試模型 9.1 概覽 9.1.1 參與者 9.1.2 調(diào)試子系統(tǒng) 9.1.3 調(diào)試事件驅(qū)動 9.2 采集調(diào)試消息 9.2.1 消息常量 9.2.2 進程和線程創(chuàng)建消息 9.2.3 進程和線程退出消息 9.2.4 模塊映射和反映射消息 9.2.5 異常消息 9.3 發(fā)送調(diào)試消息 9.3.1 調(diào)試消息結(jié)構(gòu) 9.3.2 DbgkpSendApiMessage函數(shù) 9.3.3 控制被調(diào)試進程 9.4 調(diào)試子系統(tǒng)服務(wù)器(Windows XP 之后) 9.4.1 DebugObject 9.4.2 創(chuàng)建調(diào)試對象 9.4.3 設(shè)置調(diào)試對象 9.4.4 傳遞調(diào)試消息 9.4.5 杜撰的調(diào)試消息 9.4.6 清除調(diào)試對象 9.4.7 內(nèi)核服務(wù) 9.4.8 全景 9.5 調(diào)試子系統(tǒng)服務(wù)器(Windows XP 之前) 9.5.1 概覽 9.5.2 Windows 會話管理器 9.5.3 Windows 環(huán)境子系統(tǒng)服務(wù)器進程 9.5.4 調(diào)用CSRSS 的服務(wù) 9.5.5 CsrCreateProcess 服務(wù) 9.5.6 CsrDebugProcess 服務(wù) 9.6 比較兩種模型 9.6.1 Windows 2000 調(diào)試子系統(tǒng)的優(yōu)點 9.6.2 Windows 2000 調(diào)試子系統(tǒng)的安全問題 9.6.3 Windows XP 的調(diào)試模型的優(yōu)點 9.6.4 Windows XP 引入的新調(diào)試功能 9.7 NTDLL.DLL 中的調(diào)試支持例程 9.7.1 DbgUi 函數(shù) 9.7.2 DbgSs 函數(shù) 9.7.3 Dbg 函數(shù) 9.8 調(diào)試API 9.9 本章總結(jié) 參考資料 第 10 章 用戶態(tài)調(diào)試過程 10.1 調(diào)試器進程 10.1.1 線程模型 10.1.2 調(diào)試器的工作線程 10.1.3 DbgSsReserved 字段 10.2 被調(diào)試進程 10.2.1 特征 10.2.2 DebugPort 字段 10.2.3 BeingDebugged 字段 10.2.4 觀察DebugPort 字段和BeingDebugged 字段 10.2.5 調(diào)試會話 10.3 從調(diào)試器中啟動被調(diào)試程序 10.3.1 CreateProcess API 10.3.2 第 一批調(diào)試事件 10.3.3 初始斷點 10.3.4 自動啟動調(diào)試器 10.4 附加到已經(jīng)啟動的進程中 10.4.1 DebugActiveProcess API 10.4.2 示例:TinyDbgr 程序 10.5 處理調(diào)試事件 10.5.1 DEBUG_EVENT 結(jié)構(gòu) 10.5.2 WaitForDebugEvent API 10.5.3 調(diào)試事件循環(huán) 10.5.4 回復調(diào)試事件 10.5.5 定制調(diào)試器的事件處理方式 10.6 中斷到調(diào)試器 10.6.1 初始斷點 10.6.2 編程時加入斷點 10.6.3 通過調(diào)試器設(shè)置斷點 10.6.4 通過遠程線程觸發(fā)斷點異常 10.6.5 在線程當前執(zhí)行位置設(shè)置斷點 10.6.6 動態(tài)調(diào)用遠程函數(shù) 10.6.7 掛起中斷 10.6.8 調(diào)試快捷鍵(F12 鍵) 10.6.9 窗口更新 10.7 輸出調(diào)試字符串 10.7.1 發(fā)送調(diào)試信息 10.7.2 使用調(diào)試器接收調(diào)試信息 10.7.3 使用工具接收調(diào)試信息 10.8 終止調(diào)試會話 10.8.1 被調(diào)試進程退出 10.8.2 調(diào)試器進程退出 10.8.3 分離被調(diào)試進程 10.8.4 退出時分離 10.9 本章總結(jié) 參考資料 第 11 章 中斷和異常管理 11.1 中斷描述符表 11.1.1 概況 11.1.2 門描述符 11.1.3 執(zhí)行中斷和異常處理函數(shù) 11.1.4 IDT 一覽 11.2 異常的描述和登記 11.2.1 EXCEPTION_RECORD結(jié)構(gòu) 11.2.2 登記CPU 異常 11.2.3 登記軟件異常 11.3 異常分發(fā)過程 11.3.1 KiDispatchException 函數(shù) 11.3.2 內(nèi)核態(tài)異常的分發(fā)過程 11.3.3 用戶態(tài)異常的分發(fā)過程 11.3.4 歸納 11.4 結(jié)構(gòu)化異常處理 11.4.1 SEH 簡介 11.4.2 SHE 機制的終結(jié)處理 11.4.3 SEH 機制的異常處理 11.4.4 過濾表達式 11.4.5 異常處理塊 11.4.6 嵌套使用終結(jié)處理和異常處理 11.5 向量化異常處理 11.5.1 登記和注銷 11.5.2 調(diào)用結(jié)構(gòu)化異常處理器 11.5.3 示例 11.6 本章總結(jié) 參考資料 第 12 章 未處理異常和JIT 調(diào)試 12.1 簡介 12.2 默認的異常處理器 12.2.1 BaseProcessStart 函數(shù)中的結(jié)構(gòu)化異常處理器 12.2.2 編譯器插入的SEH 處理器 12.2.3 基于信號的異常處理 12.2.4 實驗:觀察默認的異常處理器 12.2.5 BaseThreadStart 函數(shù)中的結(jié)構(gòu)化異常處理器 12.3 未處理異常過濾函數(shù) 12.3.1 Windows XP 之前的異常處理機制 12.3.2 Windows XP 中的異常處理機制 12.4 “應(yīng)用程序錯誤”對話框 12.4.1 用HardError 機制提示應(yīng)用程序錯誤 12.4.2 使用ReportFault API 提示應(yīng)用程序錯誤 12.5 JIT 調(diào)試和Dr. Watson 12.5.1 配置JIT 調(diào)試器 12.5.2 啟動JIT 調(diào)試器 12.5.3 自己編寫JIT 調(diào)試器 12.6 頂層異常過濾函數(shù) 12.6.1 注冊 12.6.2 C 運行時庫的頂層過濾函數(shù) 12.6.3 執(zhí)行 12.6.4 調(diào)試 12.7 Dr. Watson 12.7.1 配置和查看模式 12.7.2 設(shè)置為默認的JIT 調(diào)試器 12.7.3 JIT 調(diào)試模式 12.8 DRWTSN32 的日志文件 12.8.1 異常信息 12.8.2 系統(tǒng)信息 12.8.3 任務(wù)列表 12.8.4 模塊列表 12.8.5 線程狀態(tài) 12.8.6 函數(shù)調(diào)用序列 12.8.7 原始棧數(shù)據(jù) 12.9 用戶態(tài)轉(zhuǎn)儲文件 12.9.1 文件格式概覽 12.9.2 數(shù)據(jù)流 12.9.3 產(chǎn)生轉(zhuǎn)儲文件 12.9.4 讀取轉(zhuǎn)儲文件 12.9.5 利用轉(zhuǎn)儲文件分析問題 12.10 本章總結(jié) 參考資料 第 13 章 硬錯誤和藍屏 13.1 硬錯誤提示 13.1.1 缺盤錯誤 13.1.2 NtRaiseHardError 13.1.3 ExpRaiseHardError 13.1.4 CSRSS 中的分發(fā)過程 13.2 藍屏終止 13.2.1 簡介 13.2.2 發(fā)起和產(chǎn)生過程 13.2.3 診斷藍屏錯誤 13.2.4 手工觸發(fā)藍屏 13.3 系統(tǒng)轉(zhuǎn)儲文件 13.3.1 分類 13.3.2 文件格式 13.3.3 產(chǎn)生方法 13.4 分析系統(tǒng)轉(zhuǎn)儲文件 13.4.1 初步分析 13.4.2 線程和;厮 13.4.3 陷阱幀 13.4.4 自動分析 13.5 輔助的錯誤提示方法 13.5.1 MessageBeep 13.5.2 Beep 函數(shù) 13.5.3 閃動窗口 13.6 配置錯誤提示機制 13.6.1 SetErrorMode API 13.6.2 IoSetThreadHardErrorMode 13.6.3 藍屏后自動重啟 13.7 防止濫用錯誤提示機制 13.8 本章總結(jié) 參考資料 第 14 章 錯誤報告 14.1 WER 1.0 14.1.1 客戶端 14.1.2 報告模式 14.1.3 傳輸方式 14.2 系統(tǒng)錯誤報告 14.3 WER 服務(wù)器端 14.3.1 WER 服務(wù) 14.3.2 錯誤報告分類方法 14.3.3 報告回應(yīng) 14.4 WER 2.0 14.4.1 模塊變化 14.4.2 創(chuàng)建報告 14.4.3 提交報告 14.4.4 典型應(yīng)用 14.5 CER 14.6 本章總結(jié) 參考資料 第 15 章 日志 15.1 日志簡介 15.2 ELF 的架構(gòu) 15.2.1 ELF 的日志文件 15.2.2 事件源 15.2.3 ELF 服務(wù) 15.3 ELF 的數(shù)據(jù)組織350 15.3.1 日志記錄 15.3.2 添加日志記錄 15.3.3 API 一覽 15.4 查看和使用ELF 日志 15.5 CLFS 的組成和原理 15.5.1 組成 15.5.2 存儲結(jié)構(gòu) 15.5.3 LSN 15.6 CLFS 的使用方法 15.6.1 創(chuàng)建日志文件 15.6.2 添加CLFS 容器 15.6.3 創(chuàng)建編組區(qū) 15.6.4 添加日志記錄 15.6.5 讀日志記錄 15.6.6 查詢信息 15.6.7 管理和備份 15.7 本章總結(jié) 參考資料 第 16 章 事件追蹤 16.1 簡介 16.2 ETW 的架構(gòu) 16.3 提供ETW消息 16.4 控制ETW會話 16.5 消耗ETW消息 16.6 格式描述 16.6.1 MOF文件 16.6.2 WPP 16.7 NT 內(nèi)核記錄器 16.7.1 觀察NKL的追蹤事件 16.7.2 編寫代碼控制NKL 16.7.3 NKL 的實現(xiàn) 16.8 Global Logger Session 16.8.1 啟動GLS 會話 16.8.2 配置GLS 16.8.3 在驅(qū)動程序中使用GLS 16.8.4 自動記錄器 16.8.5 BootVis 工具 16.9 Crimson API 16.9.1 發(fā)布事件 16.9.2 消耗事件 16.9.3 格式描述 16.9.4 收集和觀察事件 16.9.5 Crimson API 的實現(xiàn) 16.10 本章總結(jié) 參考資料 第 17 章 WHEA 17.1 目標、架構(gòu)和PSHED.DLL 17.1.1 目標 17.1.2 架構(gòu) 17.1.3 PSHED.DLL 17.2 錯誤源 17.2.1 標準的錯誤源 17.2.2 通過ACPI 表來定義錯誤源 17.2.3 通過PSHED 插件來報告錯誤源 17.3 錯誤處理過程 17.3.1 WHEA_ERROR_PACKET結(jié)構(gòu) 17.3.2 處理過程 17.3.3 WHEA_ERROR_RECORD結(jié)構(gòu) 17.3.4 固件優(yōu)先模式 17.4 錯誤持久化 17.4.1 ERST 17.4.2 工作過程 17.5 注入錯誤 17.6 本章總結(jié) 參考資料 第 18 章 內(nèi)核調(diào)試引擎 18.1 概覽 18.1.1 KD 18.1.2 角色 18.1.3 組成 18.1.4 模塊文件 18.1.5 版本差異 18.2 連接 18.2.1 串行端口 18.2.2 1394 18.2.3 USB 2.0 18.2.4 管道 18.2.5 選擇連接方式 18.2.6 解決連接問題 18.3 啟用 18.3.1 BOOT.INI 18.3.2 BCD 18.3.3 高級啟動選項 18.4 初始化 18.4.1 Windows 系統(tǒng)啟動過程概述 18.4.2 第 一次調(diào)用KdInitSystem 18.4.3 第二次調(diào)用KdInitSystem 18.4.4 通信擴展模塊的階段1初始化 18.5 內(nèi)核調(diào)試協(xié)議 18.5.1 數(shù)據(jù)包 18.5.2 報告狀態(tài)變化 18.5.3 訪問目標系統(tǒng) 18.5.4 恢復目標系統(tǒng)執(zhí)行 18.5.5 版本 18.5.6 典型對話過程 18.5.7 KdTalker 18.6 與內(nèi)核交互 18.6.1 中斷到調(diào)試器 18.6.2 KdpSendWaitContinue 18.6.3 退出調(diào)試器 18.6.4 輪詢中斷包 18.6.5 接收和報告異常事件 18.6.6 調(diào)試服務(wù) 18.6.7 打印調(diào)試信息 18.6.8 加載調(diào)試符號 18.6.9 更新系統(tǒng)文件 18.7 建立和維持連接 18.7.1 最早的調(diào)試機會 18.7.2 初始斷點 18.7.3 斷開和重新建立連接 18.8 本地內(nèi)核調(diào)試 18.8.1 LiveKD 18.8.2 Windows 系統(tǒng)自己的本地內(nèi)核調(diào)試支持 18.8.3 安全問題 18.9 本章總結(jié) 參考資料 第 19 章 驗證機制 19.1 簡介 19.1.1 驅(qū)動程序驗證器 19.1.2 應(yīng)用程序驗證器 19.1.3 WHQL 測試 19.2 驅(qū)動驗證器的工作原理 19.2.1 設(shè)計原理 19.2.2 初始化 19.2.3 掛接驗證函數(shù) 19.2.4 驗證函數(shù)的執(zhí)行過程 19.2.5 報告驗證失敗 19.3 使用驅(qū)動驗證器 19.3.1 驗證項目 19.3.2 啟用驅(qū)動驗證器 19.3.3 開始驗證 19.3.4 觀察驗證情況 19.3.5 WinDBG 的擴展命令 19.4 應(yīng)用程序驗證器的工作原理 19.4.1 原理和組成 19.4.2 初始化 19.4.3 掛接API 19.4.4 驗證函數(shù)的執(zhí)行過程 19.4.5 報告驗證失敗 19.4.6 驗證停頓 19.5 使用應(yīng)用程序驗證器 19.5.1 應(yīng)用驗證管理器 19.5.2 驗證項目 19.5.3 配置驗證屬性 19.5.4 配置驗證停頓 19.5.5 編程調(diào)用 19.5.6 調(diào)試擴展 19.6 本章總結(jié) 參考資料 第四篇 編譯器的調(diào)試支持 第 20 章 編譯和編譯期檢查 20.1 程序的構(gòu)建過程 20.1.1 鏈接器 20.1.2 加載器 20.2 編譯 20.2.1 前端 20.2.2 后端 20.3 Visual C++編譯器 20.3.1 MSVC 簡史 20.3.2 MSVC6 20.3.3 VS7 和VS8 20.3.4 構(gòu)建程序 20.3.5 調(diào)試 20.4 編譯錯誤和警告 20.4.1 錯誤ID 和來源 20.4.2 編譯警告 20.5 編譯期檢查 20.5.1 未初始化的局部變量 20.5.2 類型不匹配 20.5.3 使用編譯器指令 20.5.4 標注 20.5.5 驅(qū)動程序靜態(tài)驗證器 20.6 標準標注語言 20.6.1 緩沖區(qū)標注符 20.6.2 高級標注符 20.7 本章總結(jié) 參考資料. 第 21 章 運行時庫和運行期檢查 21.1 C/C++運行時庫 21.1.1 C 運行時庫 21.1.2 C++標準庫 21.2 鏈接運行時庫 21.2.1 靜態(tài)鏈接和動態(tài)鏈接 21.2.2 lib 文件 21.3 運行時庫的初始化和清理 21.3.1 介入方法 21.3.2 初始化 21.3.3 多個運行時庫實例 21.4 運行期檢查 21.4.1 自動的運行期檢查 21.4.2 斷言 21.4.3 _RPT 宏 21.5 報告運行期檢查錯誤 21.5.1 _CrtDbgReport 21.5.2 _CrtSetReportMode 21.5.3 _CrtSetReportFile 21.5.4 _CrtSetReportHook 493 21.5.5 _CrtSetReportHook2 21.5.6 使用其他函數(shù)報告RTC錯誤 21.6 本章總結(jié) 參考資料 第 22 章 棧和函數(shù)調(diào)用 22.1 簡介 22.1.1 用戶態(tài)棧和內(nèi)核態(tài)棧 22.1.2 函數(shù)、過程和方法 22.2 棧的創(chuàng)建過程 22.2.1 內(nèi)核態(tài)棧的創(chuàng)建 22.2.2 用戶態(tài)棧的創(chuàng)建 22.2.3 跟蹤用戶態(tài)棧的創(chuàng)建過程 22.3 CALL 和RET 指令 22.3.1 CALL 指令 22.3.2 RET 指令 22.3.3 觀察函數(shù)調(diào)用和返回過程 22.3.4 跨特權(quán)級調(diào)用 22.4 局部變量和棧幀 22.4.1 局部變量的分配和釋放 22.4.2 EBP 寄存器和棧幀 22.4.3 幀指針和棧幀的遍歷 22.5 幀指針省略 22.6 棧指針檢查 22.7 調(diào)用協(xié)定 22.7.1 C 調(diào)用協(xié)定 22.7.2 標準調(diào)用協(xié)定 22.7.3 快速調(diào)用協(xié)定 22.7.4 This 調(diào)用協(xié)定 22.7.5 CLR 調(diào)用協(xié)定 22.7.6 x64 調(diào)用協(xié)定 22.7.7 通過編譯器開關(guān)改變默認調(diào)用協(xié)定 22.7.8 函數(shù)返回值 22.7.9 歸納和補充 22.8 ?臻g的增長和溢出 22.8.1 ?臻g的自動增長 22.8.2 棧溢出 22.8.3 分配檢查 22.9 棧下溢 22.10 緩沖區(qū)溢出 22.10.1 感受緩沖區(qū)溢出 22.10.2 緩沖區(qū)溢出攻擊 22.11 變量檢查 22.12 基于Cookie 的安全檢查 22.12.1 安全Cookie 的產(chǎn)生、植入和檢查 22.12.2 報告安全檢查失敗 22.12.3 編寫安全的代碼 22.13 本章總結(jié) 參考資料 第 23 章 堆和堆檢查 23.1 理解堆 23.2 堆的創(chuàng)建和銷毀 23.2.1 進程的默認堆 23.2.2 創(chuàng)建私有堆 23.2.3 堆列表 23.2.4 銷毀堆 23.3 分配和釋放堆塊 23.3.1 HeapAlloc 23.3.2 CRT 分配函數(shù) 23.3.3 釋放從堆中分配的內(nèi)存 23.3.4 GlobalAlloc 和LocalAlloc 23.3.5 解除提交 23.4 堆的內(nèi)部結(jié)構(gòu) 23.4.1 結(jié)構(gòu)和布局 23.4.2 HEAP 結(jié)構(gòu) 23.4.3 HEAP_SEGMENT結(jié)構(gòu) 23.4.4 HEAP_ENTRY結(jié)構(gòu) 23.4.5 分析堆塊的分配和釋放過程 23.4.6 使用!heap 命令觀察堆塊信息 23.5 低碎片堆 23.6 堆的調(diào)試支持 23.6.1 全局標志 23.6.2 堆釋放檢查 23.7 ;厮輸(shù)據(jù)庫 23.7.1 工作原理 23.7.2 DH 和UMDH工具 23.7.3 定位內(nèi)存泄漏 23.8 堆溢出和檢測 23.8.1 堆緩沖區(qū)溢出 23.8.2 調(diào)用時驗證 23.8.3 堆尾檢查 23.9 頁堆 23.9.1 總體結(jié)構(gòu) 23.9.2 啟用和觀察頁堆 23.9.3 堆塊結(jié)構(gòu) 23.9.4 檢測溢出 23.10 準頁堆 23.10.1 啟用準頁堆 23.10.2 結(jié)構(gòu)布局 23.10.3 檢測溢出 23.11 CRT 堆 23.11.1 CRT 堆的3 種模式 23.11.2 SBH 簡介 23.11.3 創(chuàng)建和選擇模式 23.11.4 CRT 堆的終止 23.12 CRT 堆的調(diào)試堆塊 23.12.1 _CrtMemBlockHeader結(jié)構(gòu) 23.12.2 塊類型 23.12.3 分配堆塊 23.13 CRT 堆的調(diào)試功能 23.13.1 內(nèi)存分配序號斷點 23.13.2 分配掛鉤 23.13.3 自動和手動檢查 23.14 堆塊轉(zhuǎn)儲 23.14.1 內(nèi)存狀態(tài)和檢查點 23.14.2 _CrtMemDumpAllObjectsSince 23.14.3 轉(zhuǎn)儲掛鉤 23.15 泄漏轉(zhuǎn)儲 23.15.1 _CrtDumpMemoryLeaks 23.15.2 何時調(diào)用 23.15.3 定位導致泄漏的源代碼 23.16 本章總結(jié) 參考資料 第 24 章 異常處理代碼的編譯 24.1 概覽 24.2 FS:[0]鏈條 24.2.1 TEB 和TIB 結(jié)構(gòu) 24.2.2 ExceptionList 字段 24.2.3 登記異常處理器 24.3 遍歷FS:[0]鏈條 24.3.1 RtlDispatchException 24.3.2 KiUserExceptionDispatcher 24.4 執(zhí)行異常處理函數(shù) 24.4.1 SehRaw 實例 24.4.2 執(zhí)行異常處理函數(shù) 24.5 _ _ try{}_ _ except()結(jié)構(gòu) 24.5.1 與手工方法的對應(yīng)關(guān)系 24.5.2 _ _ try{}_ _ except()結(jié)構(gòu)的編譯 24.5.3 范圍表 24.5.4 TryLevel 24.5.5 _ _ try{}_ _ except()結(jié)構(gòu)的執(zhí)行 24.5.6 _SEH_prolog 和_SEH_epilog 24.6 安全問題 24.6.1 安全Cookie 24.6.2 SAFESEH 24.6.3 基于表的異常處理 24.7 本章總結(jié) 參考資料 第 25 章 調(diào)試符號 25.1 名稱修飾 25.1.1 C 和C++ 25.1.2 C 的名稱修飾規(guī)則 25.1.3 C++的名稱修飾規(guī)則 25.2 調(diào)試信息的存儲格式 25.2.1 COFF格式 25.2.2 CodeView 格式 25.2.3 PDB格式 25.2.4 DWARF格式 25.3 目標文件中的調(diào)試信息 25.3.1 IMAGE_FILE_HEADER結(jié)構(gòu) 25.3.2 IMAGE_SECTION_HEADER結(jié)構(gòu) 25.3.3 節(jié)的重定位信息和行號信息 25.3.4 存儲調(diào)試數(shù)據(jù)的節(jié) 25.3.5 調(diào)試符號表 25.3.6 COFF 字符串表 25.3.7 COFF 符號例析 25.4 PE 文件中的調(diào)試信息 25.4.1 PE 文件布局 25.4.2 IMAGE_OPTIONAL_HEADER結(jié)構(gòu) 25.4.3 調(diào)試數(shù)據(jù)目錄 25.4.4 調(diào)試數(shù)據(jù) 25.4.5 使用WinDBG 觀察PE 文件中的調(diào)試信息 25.4.6 調(diào)試信息的產(chǎn)生過程 25.5 DBG 文件 25.5.1 從PE 文件產(chǎn)生DBG 文件 25.5.2 DBG 文件的布局 25.6 PDB 文件 25.6.1 復合文件 25.6.2 PDB 文件布局 25.6.3 PDB 簽名 25.6.4 Magic 代碼 25.6.5 PDB_HEADER 25.6.6 根數(shù)據(jù)流——流目錄 25.6.7 頁分配表 25.6.8 訪問PDB 文件的方式 25.6.9 PDB 文件的產(chǎn)生過程 25.7 有關(guān)的編譯和鏈接選項 25.7.1 控制調(diào)試信息的編譯選項 25.7.2 控制調(diào)試信息的鏈接選項 25.7.3 不同鏈接和編譯選項的比較 25.8 PDB 文件中的數(shù)據(jù)表 25.8.1 符號表 25.8.2 源文件表 25.8.3 節(jié)貢獻表 25.8.4 段信息表 25.8.5 注入源代碼表 25.8.6 幀數(shù)據(jù)表 25.9 本章總結(jié) 參考資料 第五篇 調(diào) 試 器 第 26 章 調(diào)試器概覽 26.1 TX-0 計算機和FLIT調(diào)試器 26.2 小型機和DDT調(diào)試器 26.2.1 PDP-1 26.2.2 TOPS-10 操作系統(tǒng)和 DDT-10 26.3 個人計算機和它的調(diào)試器 26.3.1 8086 Monitor 26.3.2 SYMDEB 26.3.3 CodeView調(diào)試器 26.3.4 Turbo Debugger 26.3.5 SoftICE 26.4 調(diào)試器的功能 26.4.1 建立和終止調(diào)試會話 26.4.2 控制被調(diào)試程序執(zhí)行 26.4.3 訪問內(nèi)存 26.4.4 訪問寄存器 26.4.5 斷點 26.4.6 跟蹤執(zhí)行 26.4.7 觀察棧和棧回溯 26.4.8 匯編和反匯編 26.4.9 源代碼級調(diào)試..685 26.4.10 EnC 26.4.11 文件管理 26.4.12 接收和顯示調(diào)試信息 26.4.13 轉(zhuǎn)儲 26.5 分類標準 26.5.1 特權(quán)級別 26.5.2 操作系統(tǒng) 26.5.3 執(zhí)行方式 26.5.4 處理器架構(gòu) 26.5.5 編程語言688 26.6 實現(xiàn)模型 26.6.1 進程內(nèi)調(diào)試模型 26.6.2 進程外調(diào)試模型 26.6.3 混合調(diào)試模型 26.6.4 內(nèi)核調(diào)試模型 26.7 經(jīng)典架構(gòu) 26.7.1 基本單元 26.7.2 遠程調(diào)試 26.7.3 多語言和多處理器架構(gòu)調(diào)試 26.8 HPD 標準 26.8.1 HPD 標準簡介 26.8.2 動作點 26.8.3 進程和線程的表示和命名 26.8.4 命令 26.9 本章總結(jié) 參考資料 第 27 章 VsDebug 27.1 架構(gòu)和調(diào)試模型 27.1.1 架構(gòu)概覽 27.1.2 遠程調(diào)試器 27.1.3 本地調(diào)試器 27.2 VS 調(diào)試引擎 27.2.1 一套接口,多種實現(xiàn) 27.2.2 核心類 27.3 工作過程 27.3.1 開始調(diào)試32 位本地程序 27.3.2 開始調(diào)試64 位本地程序 27.3.3 訪問調(diào)試目標 27.4 使用斷點 27.4.1 根據(jù)名稱設(shè)置斷點 27.4.2 數(shù)據(jù)斷點 27.4.3 附加條件 27.4.4 附加操作 27.5 多線程調(diào)試 27.5.1 并行;厮 27.5.2 并行監(jiān)視 27.5.3 凍結(jié)線程 27.6 EnC 27.6.1 應(yīng)用過程 27.6.2 要求/ZI 編譯選項 27.6.3 下次調(diào)用生效 27.6.4 應(yīng)用失敗 27.7 設(shè)計期調(diào)試 27.8 使用符號服務(wù)器 27.9 定制調(diào)試事件 27.9.1 初始斷點 27.9.2 異常設(shè)置 27.10 本章總結(jié) 參考資料 第 28 章 VS Code 的調(diào)試擴展 28.1 簡介 28.2 四大技術(shù) 28.3 理解“擴展包” 28.3.1 包類型 28.3.2 安裝 28.3.3 工作原理 28.4 擴展包API 28.4.1 貢獻點 28.4.2 命令 28.4.3 激活事件 28.5 調(diào)試模型 28.5.1 貢獻調(diào)試器 28.5.2 宏觀架構(gòu) 28.6 調(diào)試適配器 28.6.1 DA 描述符工廠 28.6.2 進程內(nèi)DA 28.6.3 vsdbg 28.6.4 OpenDebugAD7 28.7 機器接口 28.7.1 啟用用法 28.7.2 對話示例 28.7.3 MIEngine 28.8 調(diào)試Python 程序 28.8.1 PTVSD 28.8.2 發(fā)起異常時中斷 28.9 本章總結(jié) 參考資料 第 29 章 WinDBG 及其實現(xiàn) 29.1 WinDBG 溯源 29.1.1 KD 和NTSD 誕生 29.1.2 WinDBG 誕生 29.1.3 發(fā)行方式 29.1.4 版本歷史 29.2 C 階段的架構(gòu) 29.2.1 功能模塊 29.2.2 遠程調(diào)試 29.3 重構(gòu) 29.3.1 版本歷史 29.3.2 界面變化 29.3.3 模塊變化 29.3.4 發(fā)布方式和NTSD 問題 29.3.5 文件 29.4 調(diào)試器引擎的架構(gòu) 29.4.1 概覽 29.4.2 對外接口 29.4.3 DebugClient 類 29.4.4 中間層 29.4.5 服務(wù)層 29.4.6 傳輸和連接層 29.5 調(diào)試目標 29.5.1 TargetInfo 類 29.5.2 用戶態(tài)目標 29.5.3 內(nèi)核態(tài)目標 29.5.4 轉(zhuǎn)儲文件目標 29.6 調(diào)試會話 29.6.1 建立調(diào)試會話 29.6.2 調(diào)試循環(huán) 29.6.3 等待和處理調(diào)試事件 29.6.4 繼續(xù)調(diào)試事件 29.6.5 結(jié)束調(diào)試會話 29.7 接收和處理命令 29.7.1 調(diào)試器的兩種工作狀態(tài) 29.7.2 進入命令狀態(tài) 29.7.3 執(zhí)行命令 29.7.4 結(jié)束命令狀態(tài) 29.8 擴展命令的工作原理 29.9 本章總結(jié) 參考資料 第30 章 WinDBG 用法詳解 30.1 工作空間 30.2 命令概覽 30.2.1 標準命令 30.2.2 元命令 30.2.3 擴展命令 30.3 用戶界面 30.3.1 窗口概覽 30.3.2 命令窗口和命令提示符 30.4 輸入和執(zhí)行命令 30.4.1 要點 30.4.2 表達式 30.4.3 偽寄存器 30.4.4 別名 30.4.5 循環(huán)和條件執(zhí)行 30.4.6 進程限定符和線程限定符 30.4.7 記錄到文件 30.5 建立調(diào)試會話 30.5.1 附加到已經(jīng)運行的進程 30.5.2 創(chuàng)建并調(diào)試新的進程 30.5.3 非入侵式調(diào)試 30.5.4 雙機內(nèi)核調(diào)試 30.5.5 本地內(nèi)核調(diào)試 30.5.6 調(diào)試轉(zhuǎn)儲文件 30.5.7 遠程調(diào)試 30.6 終止調(diào)試會話 30.6.1 停止調(diào)試 30.6.2 分離調(diào)試目標 30.6.3 拋棄被調(diào)試進程 30.6.4 終止被調(diào)試進程 30.6.5 調(diào)試器終止或僵死 30.6.6 重新開始調(diào)試 30.7 理解上下文 30.7.1 登錄會話上下文 30.7.2 進程上下文 30.7.3 寄存器上下文 30.7.4 局部(變量)上下文 30.8 調(diào)試符號 30.8.1 重要意義 30.8.2 符號搜索路徑 30.8.3 符號服務(wù)器 30.8.4 加載符號文件 30.8.5 觀察模塊信息 30.8.6 檢查符號 30.8.7 搜索符號 30.8.8 設(shè)置符號選項 30.8.9 加載不嚴格匹配的符號文件 30.9 事件處理 30.9.1 調(diào)試事件與異常的關(guān)系 30.9.2 兩輪機會 30.9.3 定制事件處理方式 30.9.4 GH 和GN 命令 30.9.5 實驗 30.10 控制調(diào)試目標 30.10.1 初始斷點 30.10.2 俘獲調(diào)試目標 30.10.3 繼續(xù)運行 30.11 單步執(zhí)行 30.11.1 概覽 30.11.2 單步執(zhí)行到指定地址 30.11.3 單步執(zhí)行到下一個函數(shù)調(diào)用 30.11.4 單步執(zhí)行到下一分支 30.11.5 追蹤并監(jiān)視 30.11.6 程序指針飛躍 30.11.7 歸納 30.12 使用斷點 30.12.1 軟件斷點 30.12.2 硬件斷點 30.12.3 條件斷點 30.12.4 地址表達方法 30.12.5 設(shè)置針對線程的斷點 30.12.6 管理斷點 30.13 控制進程和線程 30.13.1 MulThrds 程序 30.13.2 控制線程執(zhí)行824 30.13.3 多進程調(diào)試 30.14 觀察棧 30.14.1 顯示;厮 30.14.2 觀察棧變量 30.15 分析內(nèi)存 30.15.1 顯示內(nèi)存區(qū)域 30.15.2 顯示字符串 30.15.3 顯示數(shù)據(jù)類型 30.15.4 搜索內(nèi)存 30.15.5 修改內(nèi)存 30.15.6 使用物理內(nèi)存地址 30.15.7 觀察內(nèi)存屬性 30.16 遍歷鏈表 30.16.1 結(jié)構(gòu)定義 30.16.2 雙向鏈表示例 30.16.3 單向鏈表示例 30.16.4 dl 命令 30.16.5 !list 命令 30.17 調(diào)用目標程序的函數(shù) 30.17.1 調(diào)用示例 30.17.2 工作原理 30.17.3 限制條件和常見錯誤. 30.18 命令程序 30.18.1 流程控制符號 30.18.2 變量 30.18.3 命令程序示例 30.18.4 執(zhí)行命令程序 30.19 本章總結(jié) 參考資料 附錄A 示例程序列表 附錄B WinDBG 標準命令列表 附錄C NT 內(nèi)核部件縮寫列表 持之若癡——代跋
你還可能感興趣
我要評論
|