軟件調試 第2版 捲2 : Windows 平臺調試 (上.下冊)

張銀奎

  • 出版商: 人民郵電
  • 出版日期: 2020-11-01
  • 售價: $1,194
  • 貴賓價: 9.5$1,134
  • 語言: 簡體中文
  • 頁數: 858
  • 裝訂: 平裝
  • ISBN: 7115538387
  • ISBN-13: 9787115538383

立即出貨

  • 軟件調試 第2版 捲2 : Windows 平臺調試 (上.下冊)-preview-1
  • 軟件調試 第2版 捲2 : Windows 平臺調試 (上.下冊)-preview-2
軟件調試 第2版 捲2 : Windows 平臺調試 (上.下冊)-preview-1

買這商品的人也買了...

相關主題

商品描述

本書是國內當前集中介紹軟件調試主題的權威著作。
本書第2 捲分為5 篇,共30 章,主要圍繞Windows系統展開介紹。
第一篇(第1~4 章)介紹Windows 系統簡史、進程和線程、架構和系統部件,以及Windows系統的啟動過程,既從空間角度講述Windows 的軟件世界,也從時間角度描述Windows 世界的搭建過程。
第二篇(第5~8 章)描述特殊的過程調用、墊片、托管世界和Linux 子系統。
第三篇(第9~19 章)深入探討用戶態調試模型、用戶態調試過程、中斷和異常管理、未處理異常和JIT 調試、硬錯誤和藍屏、錯誤報告、日誌、事件追蹤、WHEA、內核調試引擎和驗證機制。
第四篇(第20~25 章)從編譯和編譯期檢查、運行時庫和運行期檢查、棧和函數調用、堆和堆檢查、異常處理代碼的編譯、調試符號等方面概括編譯器的調試支持。
第五篇(第26~30 章)首先縱覽調試器的發展歷史、工作模型和經典架構,然後分別討論集成在Visual Studio 和Visual Studio(VS)Code 中的調試器,最後深度解析WinDBG 調試器的歷史、結構和用法。

本書理論與實踐結合,不僅涵蓋了相關的技術背景知識,還深入研討了大量具有代表性的技術細節,是學習軟件調試技術的珍貴資料。

本書適合所有從事軟件開發工作的讀者閱讀,特別適合從事軟件開發、測試和支持的技術人員閱讀。

作者簡介

張銀奎,國內知名的調試技術專家。

畢業於上海交通大學信息與控制工程系,長期從事軟件開發和研究工作,曾在英特爾工作13 年,對IA-32 架構、操作系統內核、驅動程序,尤其是對軟件調試有較深入的研究。
著有《軟件調試》《格蠹彙編》等暢銷、常銷技術圖書,格蠹科技(xedge.ai)創始人,高端調試網站(advdbg.org)創建者。
翻譯(合譯)作品有《二十一世紀機器人》《觀止——微軟創建NT 和未來的奪命狂奔》《數據挖掘原理》《機器學習》《人工智能:複雜問題求解的結構和策略》等。

目錄大綱

第一篇大局觀

第1章Windows系統簡史
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本章總結17
參考資料

第2章進程和線程
2.1任務
2.2進程資源
2.3進程空間
2.3.1 32位進程空間
2.3.2 64位進程空間
2.4 EPROCESS結構
2.5 PEB....28
2.6內核模式和用戶模式
2.6.1訪問模式
2.6.2使用INT 2E切換到內核模式
2.6.3快速系統調用
2.6.4逆向調用
2.6.5實例分析
2.7線程
2.7.1 ETHREAD
2.7.2 TEB
2.8 WoW進程
2.8.1架構
2.8.2工作過程
2.8.3註冊表重定向
2.8.4註冊表反射
2.8.5文件系統重定向
2.9創建進程
2.10最小進程和Pico進程
2.10.1最小進程
2.10. 2 Pico進程
2.11任務管理器
2.12本章總結
參考資料

第3章架構和系統部件
3.1系統概覽
3.1.1內核空間
3.1.2用戶空間
3.2內核和HAL模塊
3 .2.1內核文件
3.2.2 HAL文件
3.3空閒進程
3.4系統進程
3.5內核空間的其他模塊
3.6 NTDLL.DLL
3.6.1角色
3.6.2調用系統服務的樁函數
3.6.3映像文件加載器
3.6.4運行時庫
3.6.5其他功能
3.7環境子系統
3. 8原生進程
3.8.1特點
3.8.2 SMSS
3.8.3 CSRSS
3.9本章總結
參考資料

第4章啟動過程
4.1 BootMgr
4.1.1工作過程
4.1.2調試方法
4.2 WinLoad
4.3內核初始化
4.3.1 NT的入口函數
4.3.2內核初始化
4.4執行體的階段0初始化
4.4.1總體過程
4. 4.2創建特殊進程
4.5執行體的階段1初始化
4.5.1 Phase1Initialization
4.5.2喚醒其他CPU
4.5.3非啟動CPU的起步路線
4.5.4漫長的I/O初始化
4.5.5更新進度
4.6創建用戶空間
4.6.1創建會話管理器進程
4.6.2建立環境子系統
4.6.3創建窗口站和桌面
4.6.4用戶登錄
4.7本章總結
參考資料

第二篇探微

第5章特殊的過程調用
5.1異步過程調用
5.2中斷請求級別
5.2.1設計初衷
5.2.2基本原理
5.2.3析疑
5.3延遲過程調用
5.3.1使用模式
5.3.2黏滯在DPC
5.4本地過程調用
5.5遠程過程調用
5.5.1工作模型
5.5.2 RPC子系統服務
5.5.3端點和協議串
5.5.4蜂巢
5.5.5案例和調試方法
5.6本章總結
參考資料

第6章墊片
6.1墊片數據庫
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墊片動態庫
6.3.1 AcLayers.DLL
6.3.2 AcGenral.DLL和AcSpecfc.DLL
6.3.3其他墊片模塊
6.4應用程序墊片的工作過程
6.4.1在父進程中準備墊片數據
6.4.2在新進程中加載和初始化墊片引擎
6. 4.3加載墊片模塊
6.4.4落實掛鉤
6.4.5執行墊片
6.5內核墊片引擎
6.5.1數據和配置
6.5.2初始化
6.5.3 KSE墊片結構
6.5.4註冊墊片
6.5.5部署墊片
6.5.6執行墊片
6.6本章總結
參考資料

第7章託管世界
7.1簡要歷史
7.2宏偉藍圖
7.3類和方法表
7.4輔助調試線程
7.4.1託管調試模型
7.4.2 RCThread
7.4.3刺探線程
7.5 CLR4的調試模型重構
7.6 SOS擴展
7.6.1加載SOS
7.6.2設置斷點
7.6.3簡要原理
7.7本章總結
參考資料

第8章Linux子系統
8.1源於Drawbridge
8.2融入NT
8.3總體架構
8.4子系統內核模塊
8.5微軟版Linux內核
8.6 Linux子系統服務器
8.7 WSL啟動器
8.8交叉開發
8. 9 WSL2
8.10本章總結
參考資料

第三篇操作系統的調試支持

第9章用戶態調試模型
9.1概覽
9.1.1參與者
9.1.2調試子系統
9.1.3調試事件驅動
9.2採集調試消息
9.2.1消息常量
9.2.2進程和線程創建消息
9.2.3進程和線程退出消息
9.2.4模塊映射和反映射消息
9.2.5異常消息
9.3發送調試消息
9.3.1調試消息結構
9.3.2 DbgkpSendApiMessage函數
9 .3.3控制被調試進程
9.4調試子系統服務器(Windows XP之後)
9.4.1 DebugObject
9.4.2創建調試對象
9.4.3設置調試對象
9.4.4傳遞調試消息
9.4.5杜撰的調試消息
9.4.6清除調試對象
9.4.7內核服務
9.4.8全景
9.5調試子系統服務器(Windows XP之前)
9.5.1概覽
9. 5.2 Windows會話管理器
9.5.3 Windows環境子系統服務器進程
9.5.4調用CSRSS的服務
9.5.5 CsrCreateProcess服務
9.5.6 CsrDebugProcess服務
9.6比較兩種模型
9. 6.1 Windows 2000調試子系統的優點
9.6.2 Windows 2000調試子系統的安全問題
9.6.3 Windows XP的調試模型的優點
9.6.4 Windows XP引入的新調試功能
9.7 NTDLL.DLL中的調試支持例程
9.7.1 DbgUi函數
9.7.2 DbgSs函數
9.7.3 Dbg函數
9.8調試API
9.9本章總結
參考資料

第10章用戶態調試過程
10.1調試器進程
10.1.1線程模型
10.1.2調試器的工作線程
10.1.3 DbgSsReserved字段
10.2被調試進程
10.2.1特徵
10.2.2 DebugPort字段
10.2. 3 BeingDebugged字段
10.2.4觀察DebugPort字段和BeingDebugged字段
10.2.5調試會話
10.3從調試器中啟動被調試程序
10.3.1 CreateProcess API
10.3.2第一批調試事件
10 .3.3初始斷點
10.3.4自動啟動調試器
10.4附加到已經啟動的進程中
10.4.1 DebugActiveProcess API
10.4.2示例:TinyDbgr程序
10.5處理調試事件
10. 5.1 DEBUG_EVENT結構
10.5.2 WaitForDebugEvent API
10.5.3調試事件循環
10.5.4回複調試事件
10.5.5定制調試器的事件處理方式
10.6中斷到調試器
10.6.1初始斷點
10.6.2編程時加入斷點
10.6.3通過調試器設置斷點
10.6.4通過遠程線程觸發斷點異常
10.6.5在線程當前執行位置設置斷點
10.6.6動態調用遠程函數
10. 6.7掛起中斷
10.6.8調試快捷鍵(F12鍵)
10.6.9窗口更新
10.7輸出調試字符串
10.7.1發送調試信息
10.7.2使用調試器接收調試信息
10.7.3使用工具接收調試信息
10.8終止調試會話
10.8.1被調試進程退出
10.8.2調試器進程退出
10.8.3分離被調試進程
10.8.4退出時分離
10.9本章總結
參考資料

第11章中斷和異常管理
11.1中斷描述符表
11.1.1概況
11.1.2門描述符
11.1.3執行中斷和異常處理函數
11. 1.4 IDT一覽
11.2異常的描述和登記
11.2.1 EXCEPTION_RECORD結構
11.2.2登記CPU異常
11.2.3登記軟件異常
11.3異常分發過程
11.3.1 KiDispatchException函數
11.3.2內核態異常的分發過程
11.3.3用戶態異常的分發過程
11.3.4歸納
11.4結構化異常處理
11.4.1 SEH簡介
11.4.2 SHE機制的終結處理
11.4.3 SEH機制的異常處理
11.4.4過濾表達式
11 .4.5異常處理塊
11.4.6嵌套使用終結處理和異常處理
11.5向量化異常處理
11.5.1登記和註銷
11.5.2調用結構化異常處理器
11.5. 3示例
11.6本章總結
參考資料

第12章未處理異常和JIT調試
12.1簡介
12.2默認的異常處理器
12.2.1 BaseProcessStart函數中的結構化異常處理器
12.2.2編譯器插入的SEH處理器
12.2.3基於信號的異常處理
12.2.4實驗:觀察默認的異常處理器
12.2.5 BaseThreadStart函數中的結構化異常處理器
12.3未處理異常過濾函數
12.3.1 Windows XP之前的異常處理機制
12.3.2 Windows XP中的異常處理機制
12.4 “應用程序錯誤”對話框
12.4.1用HardError機制提示應用程序錯誤
12.4. 2使用ReportFault API提示應用程序錯誤
12.5 JIT調試和Dr.Watson
12.5.1配置JIT調試器
12.5.2啟動JIT調試器
12.5.3自己編寫JIT調試器
12.6頂層異常過濾函數
12.6.1註冊
12.6.2 C運行時庫的頂層過濾函數
12.6.3執行
12.6.4調試
12.7 Dr.Watson
12.7.1配置和查看模式
12.7.2設置為默認的JIT調試器
12.7.3 JIT調試模式
12.8 DRWTSN32的日誌文件
12.8.1異常信息
12.8.2系統信息
12.8.3任務列表
12.8.4模塊列表
12.8.5線程狀態
12.8.6函數調用序列
12.8.7原始棧數據
12.9用戶態轉儲文件
12.9. 1文件格式概覽
12.9.2數據流
12.9.3產生轉儲文件
12.9.4讀取轉儲文件
12.9.5利用轉儲文件分析問題
12.10本章總結
參考資料

第13章硬錯誤和藍屏
13.1硬錯誤提示
13.1.1缺盤錯誤
13.1.2 NtRaiseHardError
13.1.3 ExpRaiseHardError
13.1.4 CSRSS中的分發過程
13.2藍屏終止
13.2.1簡介
13.2.2發起和產生過程
13.2.3診斷藍屏錯誤
13.2.4手工觸發藍屏
13.3系統轉儲文件
13.3.1分類
13.3.2文件格式
13.3.3產生方法
13.4分析系統轉儲文件
13.4.1初步分析
13.4.2線程和棧回溯
13.4.3陷阱幀
13.4.4自動分析
13.5輔助的錯誤提示方法
13.5.1 MessageBeep
13.5.2 Beep函數
13.5.3閃動窗口
13.6配置錯誤提示機制
13.6.1 SetErrorMode API
13.6.2 IoSetThreadHardErrorMode
13.6.3藍屏後自動重啟
13.7防止濫用錯誤提示機制
13.8本章總結
參考資料

第14章錯誤報告
14.1 WER 1.0
14.1.1客戶端
14.1.2報告模式
14.1.3傳輸方式
14.2系統錯誤報告
14.3 WER服務器端
14.3.1 WER服務
14.3.2錯誤報告分類方法
14.3.3報告回應
14.4 WER 2.0
14 .4.1模塊變化
14.4.2創建報告
14.4.3提交報告
14.4.4典型應用
14.5 CER
14.6本章總結
參考資料

第15章日誌
15.1日誌簡介
15.2 ELF的架構
15.2.1 ELF的日誌文件
15.2.2事件源
15.2.3 ELF服務
15.3 ELF的數據組織350
15.3.1日誌記錄
15.3.2添加日誌記錄
15 .3.3 API一覽
15.4查看和使用ELF日誌
15.5 CLFS的組成和原理
15.5.1組成
15.5.2存儲結構
15.5.3 LSN
15.6 CLFS的使用方法
15.6.1創建日誌文件
15.6.2添加CLFS容器
15.6.3創建編組區
15.6.4添加日誌記錄
15.6.5讀日誌記錄
15.6.6查詢信息
15.6.7管理和備份
15.7本章總結
參考資料

第16章事件追踪
16.1簡介
16.2 ETW的架構
16.3提供ETW消息
16.4控制ETW會話
16.5消耗ETW消息
16.6格式描述
16.6.1 MOF文件
16.6.2 WPP
16.7 NT內核記錄器
16.7.1觀察NKL的追踪事件
16.7.2編寫代碼控制NKL
16.7.3 NKL的實現
16.8 Global Logger Session
16.8.1啟動GLS會話
16.8.2配置GLS
16.8.3在驅動程序中使用GLS
16 .8.4自動記錄器
16.8.5 BootVis工具
16.9 Crimson API
16.9.1發布事件
16.9.2消耗事件
16.9.3格式描述
16.9.4收集和觀察事件
16.9.5 Crimson API的實現
16.10本章總結
參考資料

第17章WHEA
17.1目標、架構和PSHED.DLL
17.1.1目標
17.1.2架構
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結構
17.3.2處理過程
17.3.3 WHEA_ERROR_RECORD結構
17.3.4固件優先模式
17.4錯誤持久化
17.4.1 ERST
17.4.2工作過程
17.5注入錯誤
17. 6本章總結
參考資料

第18章內核調試引擎
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系統啟動過程概述
18.4.2第一次調用KdInitSystem
18.4.3第二次調用KdInitSystem
18 .4.4通信擴展模塊的階段1初始化
18.5內核調試協議
18.5.1數據包
18.5.2報告狀態變化
18.5.3訪問目標系統
18.5.4恢復目標系統執行
18 .5.5版本
18.5.6典型對話過程
18.5.7 KdTalker
18.6與內核交互
18.6.1中斷到調試器
18.6.2 KdpSendWaitContinue
18.6.3退出調試器
18. 6.4輪詢中斷包
18.6.5接收和報告異常事件
18.6.6調試服務
18.6.7打印調試信息
18.6.8加載調試符號
18.6.9更新系統文件
18.7建立和維持連接
18.7.1最早的調試機會
18.7.2初始斷點
18.7.3斷開和重新建立連接
18.8本地內核調試
18.8.1 LiveKD
18.8.2 Windows系統自己的本地內核調試支持
18.8.3安全問題
18.9本章總結
參考資料

第19章驗證機制
19.1簡介
19 .1.1驅動程序驗證器
19.1.2應用程序驗證器
19.1.3 WHQL測試
19.2驅動驗證器的工作原理
19.2.1設計原理
19.2.2初始化
19.2. 3掛接驗證函數
19.2.4驗證函數的執行過程
19.2.5報告驗證失敗
19.3使用驅動驗證器
19.3.1驗證項目
19.3.2啟用驅動驗證器
19.3. 3開始驗證
19.3.4觀察驗證情況
19.3.5 WinDBG的擴展命令
19.4應用程序驗證器的工作原理
19.4.1原理和組成
19.4.2初始化
19.4.3掛接API
19.4.4驗證函數的執行過程
19.4.5報告驗證失敗
19.4.6驗證停頓
19.5使用應用程序驗證器
19.5.1應用驗證管理器
19.5.2驗證項目
19 .5.3配置驗證屬性
19.5.4配置驗證停頓
19.5.5編程調用
19.5.6調試擴展
19.6本章總結
參考資料

第四篇編譯器的調試支持

第20章編譯和編譯期檢查
20.1程序的構建過程
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構建程序
20.3.5調試
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驅動程序靜態驗證器
20.6標準標註語言
20.6.1緩衝區標註符
20.6.2高級標註符
20.7本章總結
參考資料.

第21章運行時庫和運行期檢查
21.1 C/C++運行時庫
21.1.1 C運行時庫
21.1.2 C++標準庫
21.2鏈接運行時庫
21.2.1靜態鏈接和動態鏈接
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使用其他函數報告RTC錯誤
21.6本章總結
參考資料

第22章棧和函數調用
22.1簡介
22.1.1用戶態棧和內核態棧
22.1.2函數、過程和方法
22.2棧的創建過程
22.2.1內核態棧的創建
22.2.2用戶態棧的創建
22.2.3跟踪用戶態棧的創建過程
22.3 CALL和RET指令
22.3.1 CALL指令
22.3.2 RET指令
22.3.3觀察函數調用和返回過程
22.3 .4跨特權級調用
22.4局部變量和棧幀
22.4.1局部變量的分配和釋放
22.4.2 EBP寄存器和棧幀
22.4.3幀指針和棧幀的遍歷
22.5幀指針省略
22.6棧指針檢查
22.7調用協定
22.7.1 C調用協定
22.7.2標準調用協定
22.7.3快速調用協定
22.7.4 This調用協定
22.7. 5 CLR調用協定
22.7.6 x64調用協定
22.7.7通過編譯器開關改變默認調用協定
22.7.8函數返回值
22.7.9歸納和補充
22.8棧空間的增長和溢出
22.8.1棧空間的自動增長
22.8.2棧溢出
22.8.3分配檢查
22.9棧下溢
22.10緩衝區溢出
22.10.1感受緩衝區溢出
22.10.2緩衝區溢出攻擊
22.11變量檢查
22.12基於Cookie的安全檢查
22.12.1安全Cookie的產生、植入和檢查
22.12.2報告安全檢查失敗
22.12.3編寫安全的代碼
22.13本章總結
參考資料

第23章堆和堆檢查
23.1理解堆
23.2堆的創建和銷毀
23.2.1進程的默認堆
23.2.2創建私有堆
23.2.3堆列表
23.2.4銷毀堆
23.3分配和釋放堆塊
23. 3.1 HeapAlloc
23.3.2 CRT分配函數
23.3.3釋放從堆中分配的內存
23.3.4 GlobalAlloc和LocalAlloc
23.3.5解除提交
23.4堆的內部結構
23.4. 1結構和佈局
23.4.2 HEAP結構
23.4.3 HEAP_SEGMENT結構
23.4.4 HEAP_ENTRY結構
23.4.5分析堆塊的分配和釋放過程
23.4.6使用!heap命令觀察堆塊信息
23.5低碎片堆
23.6堆的調試支持
23.6.1全局標誌
23.6.2堆釋放檢查
23.7棧回溯數據庫
23.7 .1工作原理
23.7.2 DH和UMDH工具
23.7.3定位內存洩漏
23.8堆溢出和檢測
23.8.1堆緩衝區溢出
23.8.2調用時驗證
23.8.3堆尾檢查
23.9頁堆
23.9.1總體結構
23.9.2啟用和觀察頁堆
23.9.3堆塊結構
23.9.4檢測溢出
23.10準頁堆
23.10. 1啟用準頁堆
23.10.2結構佈局
23.10.3檢測溢出
23.11 CRT堆
23.11.1 CRT堆的3種模式
23.11.2 SBH簡介
23.11.3創建和選擇模式
23.11.4 CRT堆的終止
23.12 CRT堆的調試堆塊
23.12.1 _CrtMemBlockHeader結構
23.12.2塊類型
23.12.3分配堆塊
23.13 CRT堆的調試功能
23.13.1內存分配序號斷點
23.13.2分配掛鉤
23.13.3自動和手動檢查
23.14堆塊轉儲
23.14.1內存狀態和檢查點
23.14.2 _CrtMemDumpAllObjectsSince
23 .14.3轉儲掛鉤
23.15洩漏轉儲
23.15.1 _CrtDumpMemoryLeaks
23.15.2何時調用
23.15.3定位導致洩漏的源代碼
23.16本章總結
參考資料

第24章異常處理代碼的編譯
24.1概覽
24.2 FS:[0]鏈條
24.2.1 TEB和TIB結構
24.2.2 ExceptionList字段
24.2.3登記異常處理器
24.3遍歷FS:[0]鏈條
24.3.1 RtlDispatchException
24.3.2 KiUserExceptionDispatcher
24.4執行異常處理函數
24.4.1 SehRaw實例
24.4.2執行異常處理函數
24.5 _ _ try{}_ _ except()結構
24.5.1與手工方法的對應關係
24.5.2 _ _ try{}_ _ except()結構的編譯
24.5.3範圍表
24.5.4 TryLevel
24.5.5 _ _ try{}_ _ except()結構的執行
24.5.6 _SEH_prolog和_SEH_epilog
24.6安全問題
24.6.1安全Cookie
24.6.2 SAFESEH
24.6.3基於表的異常處理
24.7本章總結
參考資料

第25章調試符號
25.1名稱修飾
25.1.1 C和C++
25.1.2 C的名稱修飾規則
25.1.3 C++的名稱修飾規則
25.2調試信息的存儲格式
25.2.1 COFF格式
25.2.2 CodeView格式
25.2.3 PDB格式
25.2.4 DWARF格式
25 .3目標文件中的調試信息
25.3.1 IMAGE_FILE_HEADER結構
25.3.2 IMAGE_SECTION_HEADER結構
25.3.3節的重定位信息和行號信息
25.3.4存儲調試數據的節
25.3. 5調試符號表
25.3.6 COFF字符串表
25.3.7 COFF符號例析
25.4 PE文件中的調試信息
25.4.1 PE文件佈局
25.4.2 IMAGE_OPTIONAL_HEADER結構
25.4.3調試數據目錄
25.4.4調試數據
25.4.5使用WinDBG觀察PE文件中的調試信息
25.4.6調試信息的產生過程
25.5 DBG文件
25.5.1從PE文件產生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根數據流——流目錄
25.6.7頁分配表
25.6.8訪問PDB文件的方式
25 .6.9 PDB文件的產生過程
25.7有關的編譯和鏈接選項
25.7.1控制調試信息的編譯選項
25.7.2控制調試信息的鏈接選項
25.7.3不同鏈接和編譯選項的比較
25.8 PDB文件中的數據表
25.8.1符號表
25.8.2源文件表
25.8.3節貢獻表
25.8.4段信息表
25.8.5注入源代碼表
25.8.6幀數據表
25.9本章總結
參考資料

第五篇調試器

第26章調試器概覽
26.1 TX-0計算機和FLIT調試器
26.2小型機和DDT調試器
26.2.1 PDP-1
26.2. 2 TOPS-10操作系統和
DDT-10
26.3個人計算機和它的調試器
26.3.1 8086 Monitor
26.3.2 SYMDEB
26.3.3 CodeView調試器
26.3.4 Turbo Debugger
26. 3.5 SoftICE
26.4調試器的功能
26.4.1建立和終止調試會話
26.4.2控制被調試程序執行
26.4.3訪問內存
26.4.4訪問寄存器
26.4.5斷點
26.4.6跟踪執行
26.4.7觀察棧和棧回溯
26.4.8彙編和反彙編
26.4.9源代碼級調試..685
26.4.10 EnC
26.4.11文件管理
26.4.12接收和顯示調試信息
26.4.13轉儲
26.5分類標準
26.5.1特權級別
26.5.2操作系統
26.5.3執行方式
26.5.4處理器架構
26.5.5編程語言688
26.6實現模型
26.6.1進程內調試模型
26.6.2進程外調試模型
26.6. 3混合調試模型
26.6.4內核調試模型
26.7經典架構
26.7.1基本單元
26.7.2遠程調試
26.7.3多語言和多處理器架構調試
26.8 HPD標準
26 .8.1 HPD標準簡介
26.8.2動作點
26.8.3進程和線程的表示和命名
26.8.4命令
26.9本章總結
參考資料

第27章VsDebug
27.1架構和調試模型
27.1.1架構概覽
27.1.2遠程調試器
27.1.3本地調試器
27.2 VS調試引擎
27.2.1一套接口,多種實現
27.2.2核心類
27. 3工作過程
27.3.1開始調試32位本地程序
27.3.2開始調試64位本地程序
27.3.3訪問調試目標
27.4使用斷點
27.4.1根據名稱設置斷點
27.4.2數據斷點
27.4.3附加條件
27.4.4附加操作
27.5多線程調試
27.5.1並行棧回溯
27.5.2並行監視
27.5.3凍結線程
27.6 EnC
27.6.1應用過程
27.6.2要求/ZI編譯選項
27.6.3下次調用生效
27.6.4應用失敗
27.7設計期調試
27.8使用符號服務器
27 .9定制調試事件
27.9.1初始斷點
27.9.2異常設置
27.10本章總結
參考資料

第28章VS Code的調試擴展
28.1簡介
28.2四大技術
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調試模型
28.5.1貢獻調試器
28.5.2宏觀架構
28.6調試適配器
28.6.1 DA描述符工廠
28.6.2進程內DA
28.6.3 vsdbg
28.6.4 OpenDebugAD7
28.7機器接口
28.7.1啟用用法
28.7.2對話示例
28.7.3 MIEngine
28.8調試Python程序
28.8.1 PTVSD
28.8.2發起異常時中斷
28.9本章總結
參考資料

第29章WinDBG及其實現
29.1 WinDBG溯源
29.1.1 KD和NTSD誕生
29.1.2 WinDBG誕生
29.1.3發行方式
29.1.4版本歷史
29.2 C階段的架構
29.2.1功能模塊
29.2.2遠程調試
29.3重構
29.3.1版本歷史
29. 3.2界面變化
29.3.3模塊變化
29.3.4發布方式和NTSD問題
29.3.5文件
29.4調試器引擎的架構
29.4.1概覽
29.4.2對外接口
29 .4.3 DebugClient類
29.4.4中間層
29.4.5服務層
29.4.6傳輸和連接層
29.5調試目標
29.5.1 TargetInfo類
29.5.2用戶態目標
29.5.3內核態目標
29.5.4轉儲文件目標
29.6調試會話
29.6.1建立調試會話
29.6.2調試循環
29.6.3等待和處理調試事件
29.6.4繼續調試事件
29.6.5結束調試會話
29.7接收和處理命令
29 .7.1調試器的兩種工作狀態
29.7.2進入命令狀態
29.7.3執行命令
29.7.4結束命令狀態
29.8擴展命令的工作原理
29.9本章總結
參考資料

第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輸入和執行命令
30.4.1要點
30.4.2表達式
30.4.3偽寄存器
30.4.4別名
30.4.5循環和條件執行
30.4.6進程限定符和線程限定符
30.4.7記錄到文件
30.5建立調試會話
30.5.1附加到已經運行的進程
30.5. 2創建並調試新的進程
30.5.3非入侵式調試
30.5.4雙機內核調試
30.5.5本地內核調試
30.5.6調試轉儲文件
30.5.7遠程調試
30 .6終止調試會話
30.6.1停止調試
30.6.2分離調試目標
30.6.3拋棄被調試進程
30.6.4終止被調試進程
30.6.5調試器終止或僵死
30. 6.6重新開始調試
30.7理解上下文
30.7.1登錄會話上下文
30.7.2進程上下文
30.7.3寄存器上下文
30.7.4局部(變量)上下文
30.8調試符號
30. 8.1重要意義
30.8.2符號搜索路徑
30.8.3符號服務器
30.8.4加載符號文件
30.8.5觀察模塊信息
30.8.6檢查符號
30.8.7搜索符號
30.8.8設置符號選項
30.8.9加載不嚴格匹配的符號文件
30.9事件處理
30.9.1調試事件與異常的關係
30.9.2兩輪機會
30.9.3定制事件處理方式
30.9.4 GH和GN命令
30.9.5實驗
30.10控制調試目標
30.10.1初始斷點
30.10.2俘獲調試目標
30.10.3繼續運行
30.11單步執行
30.11.1概覽
30.11.2單步執行到指定地址
30.11.3單步執行到下一個函數調用
30.11.4單步執行到下一分支
30.11.5追踪並監視
30.11.6程序指針飛躍
30.11.7歸納
30.12使用斷點
30.12.1軟件斷點
30.12.2硬件斷點
30.12.3條件斷點
30.12.4地址表達方法
30.12 .5設置針對線程的斷點
30.12.6管理斷點
30.13控制進程和線程
30.13.1 MulThrds程序
30.13.2控制線程執行824
30.13.3多進程調試
30.14觀察棧
30.14.1顯示棧回溯
30.14.2觀察棧變量
30.15分析內存
30.15.1顯示內存區域
30.15.2顯示字符串
30.15.3顯示數據類型
30.15.4搜索內存
30.15.5修改內存
30.15.6使用物理內存地址
30.15.7觀察內存屬性
30.16遍歷鍊錶
30.16.1結構定義
30.16.2雙向鍊錶示例
30.16.3單向鍊錶示例
30 .16.4 dl命令
30.16.5 !list命令
30.17調用目標程序的函數
30.17.1調用示例
30.17.2工作原理
30.17.3限制條件和常見錯誤.
30.18命令程序
30.18.1流程控制符號
30.18.2變量
30.18.3命令程序示例
30.18.4執行命令程序
30.19本章總結
參考資料

附錄A示例程序列表
附錄B WinDBG標準命令列表
附錄C NT內核部件縮寫列表
持之若痴——代跋