作 者:張銀奎 著
定 價:199
出 版 社:人民郵電出版社
出版日期:2020年09月01日
頁 數:888
裝 幀:平裝
ISBN:9787115538383
1. 軟件調試領域的“百科全書”,圍繞軟件調試的“生態”繫統(ecosystem)、異常(exception)和調試器三條主線,介紹軟件調試的相關原理和機制,探討可調試性(debuggability)的內涵、意義,以及實現軟件可調試性的原則和方法,總結軟件調試的理論和很好實踐;2. 作者張銀奎是軟件調試領域資-深專家,國內軟件調試技術專家; 3. 內容全面:為了便於攜帶和閱讀,裝定為上、下兩冊;4. 理論與實踐結合:不僅涵蓋了相關的技術背景知識,還深入研討了大量具有代表性的技術細節;5.等
●第一篇大局觀
第1章Windows繫統簡史
1.1源於DOS
1.2功在NT
1.3Windows2000彰顯實力
1.4巔峰之作:WindowsXP和WindowsServer2003
1.5WindowsVista折戟沙場
1.6Windows7享利中興
1.7Windows8革新受挫
1.8Windows10何去何從
1.9本章總結17
參考資料
第2章進程和線程
2.1任務
2.2進程資源
2.3進程空間
2.3.132位進程空間
2.3.264位進程空間
2.4EPROCESS結構
2.5PEB
2.6內核模式和用戶模式
2.6.1訪問模式
2.6.2使用INT2E切換到內核模式
2.6.3快速繫統調用
2.6.4逆向調用
2.6.5實例分析
2.7線程
2.7.1ETHREAD
2.7.2TEB
2.8WoW進程
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.2Pico進程
2.11任務管理器
2.12本章總結
參考資料
第3章架構和繫統部件
3.1繫統概覽
3.1.1內核空間
3.1.2用戶空間
3.2內核和HAL模塊
3.2.1內核文件
3.2.2HAL文件
3.3空閑進程
3.4繫統進程
3.5內核空間的其他模塊
3.6NTDLL.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.2SMSS
3.8.3CSRSS
3.9本章總結
參考資料
第4章啟動過程
4.1BootMgr
4.1.1工作過程
4.1.2調試方法
4.2WinLoad
4.3內核初始化
4.3.1NT的入口函數
4.3.2內核初始化
4.4執行體的階段0初始化
4.4.1總體過程
4.4.2創建特殊進程
4.5執行體的階段1初始化
4.5.1Phase1Initialization
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.2RPC子繫統服務
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.2AppHelp
6.2.1SDB功能
6.2.2墊片引擎
6.2.3AD掛鉤
6.2.4穿山甲掛鉤
6.3墊片動態庫
6.3.1AcLayers.DLL
6.3.2AcGenral.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.3KSE墊片結構
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.2RCThread
7.4.3刺探線程
7.5CLR4的調試模型重構
7.6SOS擴展
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.6Linux子繫統服務器
8.7WSL啟動器
8.8交叉開發
8.9WSL2
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.2DbgkpSendApiMessage函數
9.3.3控制被調試進程
9.4調試子繫統服務器(WindowsXP之後)
9.4.1DebugObject
9.4.2創建調試對像
9.4.3設置調試對像
9.4.4傳遞調試消息
9.4.5杜撰的調試消息
9.4.6清除調試對像
9.4.7內核服務
9.4.8全景
9.5調試子繫統服務器(WindowsXP之前)
9.5.1概覽
9.5.2Windows會話管理器
9.5.3Windows環境子繫統服務器進程
9.5.4調用CSRSS的服務
9.5.5CsrCreateProcess服務
9.5.6CsrDebugProcess服務
9.6比較兩種模型
9.6.1Windows2000調試子繫統的優點
9.6.2Windows2000調試子繫統的安全問題
9.6.3WindowsXP的調試模型的優點
9.6.4WindowsXP引入的新調試功能
9.7NTDLL.DLL中的調試支持例程
9.7.1DbgUi函數
9.7.2DbgSs函數
9.7.3Dbg函數
9.8調試API
9.9本章總結
參考資料
第10章用戶態調試過程
10.1調試器進程
10.1.1線程模型
10.1.2調試器的工作線程
10.1.3DbgSsReserved字段
10.2被調試進程
10.2.1特征
10.2.2DebugPort字段
10.2.3BeingDebugged字段
10.2.4觀察DebugPort字段和BeingDebugged字段
10.2.5調試會話
10.3從調試器中啟動被調試程序
10.3.1CreateProcessAPI
10.3.2第一批調試事件
10.3.3初始斷點
10.3.4自動啟動調試器
10.4附加到已經啟動的進程中
10.4.1DebugActiveProcessAPI
10.4.2示例:TinyDbgr程序
10.5處理調試事件
10.5.1DEBUG_EVENT結構
10.5.2WaitForDebugEventAPI
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.4IDT一覽
11.2異常的描述和登記
11.2.1EXCEPTION_RECORD結構
11.2.2登記CPU異常
11.2.3登記軟件異常
11.3異常分發過程
11.3.1KiDispatchException函數
11.3.2內核態異常的分發過程
11.3.3用戶態異常的分發過程
11.3.4歸納
11.4結構化異常處理
11.4.1SEH簡介
11.4.2SHE機制的終結處理
11.4.3SEH機制的異常處理
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.1BaseProcessStart函數中的結構化異常處理器
12.2.2編譯器插入的SEH處理器
12.2.3基於信號的異常處理
12.2.4實驗:觀察默認的異常處理器
12.2.5BaseThreadStart函數中的結構化異常處理器
12.3未處理異常過濾函數
12.3.1WindowsXP之前的異常處理機制
12.3.2WindowsXP中的異常處理機制
12.4“應用程序錯誤”對話框
12.4.1用HardError機制提示應用程序錯誤
12.4.2使用ReportFaultAPI提示應用程序錯誤
12.5JIT調試和Dr.Watson
12.5.1配置JIT調試器
12.5.2啟動JIT調試器
12.5.3自己編寫JIT調試器
12.6頂層異常過濾函數
12.6.1注冊
12.6.2C運行時庫的頂層過濾函數
12.6.3執行
12.6.4調試
12.7Dr.Watson
12.7.1配置和查看模式
12.7.2設置為默認的JIT調試器
12.7.3JIT調試模式
12.8DRWTSN32的日志文件
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.2NtRaiseHardError
13.1.3ExpRaiseHardError
13.1.4CSRSS中的分發過程
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.1MessageBeep
13.5.2Beep函數
13.5.3閃動窗口
13.6配置錯誤提示機制
13.6.1SetErrorModeAPI
13.6.2IoSetThreadHardErrorMode
13.6.3藍屏後自動重啟
13.7防止濫用錯誤提示機制
13.8本章總結
參考資料
第14章錯誤報告
14.1WER1.0
14.1.1客戶端
14.1.2報告模式
14.1.3傳輸方式
14.2繫統錯誤報告
14.3WER服務器端
14.3.1WER服務
14.3.2錯誤報告分類方法
14.3.3報告回應
14.4WER2.0
14.4.1模塊變化
14.4.2創建報告
14.4.3提交報告
14.4.4典型應用
14.5CER
14.6本章總結
參考資料
第15章日志
15.1日志簡介
15.2ELF的架構
15.2.1ELF的日志文件
15.2.2事件源
15.2.3ELF服務
15.3ELF的數據組織350
15.3.1日志記錄
15.3.2添加日志記錄
15.3.3API一覽
15.4查看和使用ELF日志
15.5CLFS的組成和原理
15.5.1組成
15.5.2存儲結構
15.5.3LSN
15.6CLFS的使用方法
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.2ETW的架構
16.3提供ETW消息
16.4控制ETW會話
16.5消耗ETW消息
16.6格式描述
16.6.1MOF文件
16.6.2WPP
16.7NT內核記錄器
16.7.1觀察NKL的追蹤事件
16.7.2編寫代碼控制NKL
16.7.3NKL的實現
16.8GlobalLoggerSession
16.8.1啟動GLS會話
16.8.2配置GLS
16.8.3在驅動程序中使用GLS
16.8.4自動記錄器
16.8.5BootVis工具
16.9CrimsonAPI
16.9.1發布事件
16.9.2消耗事件
16.9.3格式描述
16.9.4收集和觀察事件
16.9.5CrimsonAPI的實現
16.10本章總結
參考資料
第17章WHEA
17.1目標、架構和PSHED.DLL
17.1.1目標
17.1.2架構
17.1.3PSHED.DLL
17.2錯誤源
17.2.1標準的錯誤源
17.2.2通過ACPI表來定義錯誤源
17.2.3通過PSHED插件來報告錯誤源
17.3錯誤處理過程
17.3.1WHEA_ERROR_PACKET結構
17.3.2處理過程
17.3.3WHEA_ERROR_RECORD結構
17.3.4固件優先模式
17.4錯誤持久化
17.4.1ERST
17.4.2工作過程
17.5注入錯誤
17.6本章總結
參考資料
第18章內核調試引擎
18.1概覽
18.1.1KD
18.1.2角色
18.1.3組成
18.1.4模塊文件
18.1.5版本差異
18.2連接
18.2.1串行端口
18.2.21394
18.2.3USB2.0
18.2.4管道
18.2.5選擇連接方式
18.2.6解決連接問題
18.3啟用
18.3.1BOOT.INI
18.3.2BCD
18.3.3高級啟動選項
18.4初始化
18.4.1Windows繫統啟動過程概述
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.7KdTalker
18.6與內核交互
18.6.1中斷到調試器
18.6.2KdpSendWaitContinue
18.6. 出調試器
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.1LiveKD
18.8.2Windows繫統自己的本地內核調試支持
18.8.3安全問題
18.9本章總結
參考資料
第19章驗證機制
19.1簡介
19.1.1驅動程序驗證器
19.1.2應用程序驗證器
19.1.3WHQL測試
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.5WinDBG的擴展命令
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.3VisualC++編譯器
20.3.1MSVC簡史
20.3.2MSVC6
20.3.3VS7和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.1C/C++運行時庫
21.1.1C運行時庫
21.1.2C++標準庫
21.2鏈接運行時庫
21.2.1靜態鏈接和動態鏈接
21.2.2lib文件
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_CrtSetReportHook493
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.3CALL和RET指令
22.3.1CALL指令
22.3.2RET指令
22.3.3觀察函數調用和返回過程
22.3.4跨特權級調用
22.4局部變量和棧幀
22.4.1局部變量的分配和釋放
22.4.2EBP寄存器和棧幀
22.4.3幀指針和棧幀的遍歷
22.5幀指針省略
22.6棧指針檢查
22.7調用協定
22.7.1C調用協定
22.7.2標準調用協定
22.7.3快速調用協定
22.7.4This調用協定
22.7.5CLR調用協定
22.7.6x64調用協定
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.1HeapAlloc
23.3.2CRT分配函數
23.3.3釋放從堆中分配的內存
23.3.4GlobalAlloc和LocalAlloc
23.3.5解除提交
23.4堆的內部結構
23.4.1結構和布局
23.4.2HEAP結構
23.4.3HEAP_SEGMENT結構
23.4.4HEAP_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.2DH和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.11CRT堆
23.11.1CRT堆的3種模式
23.11.2SBH簡介
23.11.3創建和選擇模式
23.11.4CRT堆的終止
23.12CRT堆的調試堆塊
23.12.1_CrtMemBlockHeader結構
23.12.2塊類型
23.12.3分配堆塊
23.13CRT堆的調試功能
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.2FS:[0]鏈條
24.2.1TEB和TIB結構
24.2.2ExceptionList字段
24.2.3登記異常處理器
24.3遍歷FS:[0]鏈條
24.3.1RtlDispatchException
24.3.2KiUserExceptionDispatcher
24.4執行異常處理函數
24.4.1SehRaw實例
24.4.2執行異常處理函數
24.5__try{}__except()結構
24.5.1與手工方法的對應關繫
24.5.2__try{}__except()結構的編譯
24.5.3範圍表
24.5.4TryLevel
24.5.5__try{}__except()結構的執行
24.5.6_SEH_prolog和_SEH_epilog
24.6安全問題
24.6.1安全Cookie
24.6.2SAFESEH
24.6.3基於表的異常處理
24.7本章總結
參考資料
第25章調試符號
25.1名稱修飾
25.1.1C和C++
25.1.2C的名稱修飾規則
25.1.3C++的名稱修飾規則
25.2調試信息的存儲格式
25.2.1COFF格式
25.2.2CodeView格式
25.2.3PDB格式
25.2.4DWARF格式
25.3目標文件中的調試信息
25.3.1IMAGE_FILE_HEADER結構
25.3.2IMAGE_SECTION_HEADER結構
25.3.3節的重定位信息和行號信息
25.3.4存儲調試數據的節
25.3.5調試符號表
25.3.6COFF字符串表
25.3.7COFF符號例析
25.4PE文件中的調試信息
25.4.1PE文件布局
25.4.2IMAGE_OPTIONAL_HEADER結構
25.4.3調試數據目錄
25.4.4調試數據
25.4.5使用WinDBG觀察PE文件中的調試信息
25.4.6調試信息的產生過程
25.5DBG文件
25.5.1從PE文件產生DBG文件
25.5.2DBG文件的布局
25.6PDB文件
25.6.1復合文件
25.6.2PDB文件布局
25.6.3PDB簽名
25.6.4Magic代碼
25.6.5PDB_HEADER
25.6.6根數據流——流目錄
25.6.7頁分配表
25.6.8訪問PDB文件的方式
25.6.9PDB文件的產生過程
25.7有關的編譯和鏈接選項
25.7.1控制調試信息的編譯選項
25.7.2控制調試信息的鏈接選項
25.7.3不同鏈接和編譯選項的比較
25.8PDB文件中的數據表
25.8.1符號表
25.8.2源文件表
25.8.3節貢獻表
25.8.4段信息表
25.8.5注入源代碼表
25.8.6幀數據表
25.9本章總結
參考資料
第五篇調試器
第26章調試器概覽
26.1TX-0計算機和FLIT調試器
26.2小型機和DDT調試器
26.2.1PDP-1
26.2.2TOPS-10操作繫統和
DDT-10
26.3個人計算機和它的調試器
26.3.18086Monitor
26.3.2SYMDEB
26.3.3CodeView調試器
26.3.4TurboDebugger
26.3.5SoftICE
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源代碼級調試
26.4.10EnC
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.8HPD標準
26.8.1HPD標準簡介
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.2VS調試引擎
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.6EnC
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章VSCode的調試擴展
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.1DA描述符工廠
28.6.2進程內DA
28.6.3vsdbg
28.6.4OpenDebugAD7
28.7機器接口
28.7.1啟用用法
28.7.2對話示例
28.7.3MIEngine
28.8調試Python程序
28.8.1PTVSD
28.8.2發起異常時中斷
28.9本章總結
參考資料
第29章WinDBG及其實現
29.1WinDBG溯源
29.1.1KD和NTSD誕生
29.1.2WinDBG誕生
29.1.3發行方式
29.1.4版本歷史
29.2C階段的架構
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.3DebugClient類
29.4.4中間層
29.4.5服務層
29.4.6傳輸和連接層
29.5調試目標
29.5.1TargetInfo類
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.命令
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.4GH和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 lThrds程序
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.4dl命令
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示例程序列表
附錄BWinDBG標準命令列表
附錄CNT內核部件縮寫列表
持之若痴——代跋
本書是國內當前集中介紹軟件調試主題的權威著作。本書第2卷分為5篇,共30章,主要圍繞Windows繫統展開介紹。第一篇(第1~4章)介紹Windows繫統簡史、進程和線程、架構和繫統部件,以及Windows繫統的啟動過程,既從空間角度講述Windows的軟件世界,也從時間角度描述Windows世界的搭建過程。第二篇(第5~8章)描述特殊的過程調用、墊片、托管世界和Linux子繫統。第三篇(第9~19章)深入探討用戶態調試模型、用戶態調試過程、中斷和異常管理、未處理異常和JIT調試、硬錯誤和藍屏、錯誤報告、日志、事件追蹤、WHEA、內核調試引擎和驗證機制。第四篇(第20~25章)從編譯和編譯期檢查、運行時庫和運行期檢查、棧和函數調用、堆和堆檢查、異常處理代碼的編譯、調試符號等方面概括編譯器的調試支持。第五篇(第26~30章)首先縱覽調試器的發展歷史、工作模型和經典架構,然後分別討論集成在Vi等
張銀奎 著
張銀奎,國內知名的調試技術專家。畢業於上海交通大學信息與控制工程繫,長期從事軟件開發和研究工作,曾在英特爾工作13 年,對 IA-32 架構、操作繫統內核、驅動程序,尤其是對軟件調試有較深入的研究。