-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

軟件調試 第2版 卷2 Windows平臺調試 上、下冊

( 簡體 字)
作者:張銀奎類別:1. -> 程式設計 -> 綜合
譯者:
出版社:人民郵電出版社軟件調試 第2版 卷2 Windows平臺調試 上、下冊 3dWoo書號: 53451
詢問書籍請說出此書號!

缺書
NT售價: 995

出版日:9/1/2020
頁數:858
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787115538383
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

內容簡介:

本書是國內當前集中介紹軟件調試主題的權威著作。本書第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 調試器的歷史、結構和用法。
本書理論與實踐結合,不僅涵蓋了相關的技術背景知識,還深入研討了大量具有代表性的技術細節,是學習軟件調試技術的珍貴資料。
本書適合所有從事軟件開發工作的讀者閱讀,特別適合從事軟件開發、測試和支持的技術人員閱讀。
目錄:

第 一篇 大 局 觀
第 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 內核部件縮寫列表
持之若癡——代跋
序: