Windows 編程調試技術內幕 (Inside Windows Debugging: A Practical Guide to Debugging and Tracing Strategies in Windows)

[印度]塔里克·索拉米(Tarik Soulami)

  • Windows 編程調試技術內幕 (Inside Windows Debugging: A Practical Guide to Debugging and Tracing Strategies in Windows)-preview-1
  • Windows 編程調試技術內幕 (Inside Windows Debugging: A Practical Guide to Debugging and Tracing Strategies in Windows)-preview-2
Windows 編程調試技術內幕 (Inside Windows Debugging: A Practical Guide to Debugging and Tracing Strategies in Windows)-preview-1

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

商品描述

這是一本介紹 Windows 編程調試技術的書。本書簡述了 Windows 開發框架和操作系統中的層。在用調試和跟蹤工具發現數據意義時,這些基礎知識非常重要。本書還談到了“調試的樂趣和好處”,描述了 Windows 操作系統中調試器的架構,並介紹了一些可擴展的策略,以幫助你充分利用 Windows 的調試器。本書還展示了 WinDbg 調試器的用法,通過分析代碼和操作系統之間的重要相互作用來幫助你更好地瞭解系統內核。最後,本書就“觀察和分析軟件的行為”展開討論,介紹了 Windows 事件跟蹤(ETW)技術,並說明瞭在調試和分析調查中利用 ETW 技術的方法。

本書適合程序員、安全人員、軟件測試人員閱讀,也可以作為大專院校相關專業的教學用書和機構的培訓用書。

作者簡介

塔里克.索拉米(Tarik Soulami)是Windows基礎團隊首席開發主管,曾在微軟從事過10餘年的系統級軟件設計和開發工作。
加入Windows基礎團隊之前,他曾在通用語言運行平台(CLR)團隊工作,參與了微軟.NET框架早期版本的開發。

目錄大綱

第一部分背景

第1章Windows軟件開發3
1.1 Windows發展過程3
1.1.1 Windows版本歷史3
1.1.2支持的CPU架構4
1.1.3 Windows版本特性5
1.1.4 Windows服務術語5
1.2 Windows架構6
1.2.1內核態與用戶態6
1.2.2用戶態系統進程7
1.2.3用戶態應用進程8
1.2.4低級別的Windows通信機制11
1.3 Windows開發人員接口13
1.3.1開發人員文檔資源13
1.3.2 WDM、KMDF和UMDF 14
1.3.3 NTDLL和USER32層14
1.3.4 Win32 API層15
1.3.5 COM層15
1.3.6 CLR(.NET)層20
1.4微軟開發工具22
1.4.1 Windows驅動程序開發工具包(WDK) 23
1.4.2 Windows軟件開發工具包23
1.5小結23

第二部分調試的樂趣和好處

第2章入門27
2.1調試工具介紹27
2.1.1獲取Windows調試器軟件包27
2.1.2獲取Visual Studio調試器31
2.1.3 WinDbg和Visual Studio調試器對比31
2.2用戶態調試32
2.2.1使用WinDbg調試你的第一個程序32
2.2. 2列舉局部變量和函數參數值39
2.2.3 WinDbg中的源碼級調試43
2.2.4符號文件、服務器和本地緩存44
2.2.5 WinDbg符號離線緩存45
2.2.6 WinDbg中符號解析問題的故障排除46
2.2.7名稱修飾注意事項46
2.2.8獲取WinDbg命令的幫助48
2.3內核態調試49
2.3.1你的第一個(實時)內核態調試會話50
2.3.2使用物理機建立一個內核態調試環境55
2.3.3使用虛擬機設置內核態調試環境60
2.3.4診斷主機/目標機通信問題62
2.3. 5理解KD中斷序列63
2.3.6在內核態調試器中控制目標機64
2.3.7在內核態調試器中設置代碼斷點66
2.3.8獲取WinDbg內核態調試命令的幫助68
2.4小結68

第3章Windows調試器是如何工作的70
3.1用戶態調試70
3.1.1架構概述70
3.1.2 Win32調試API 71
3.1.3調試事件和異常72
3.1.4中斷序列75
3.1.5設置代碼斷點76
3.1.6觀察WinDbg中的代碼斷點插入77
3.2內核態調試81
3.2.1架構概述81
3.2.2設置代碼斷點82
3.2.3單步執行目標82
3.2.4切換當前進程上下文83
3.3託管代碼調試84
3.3.1架構概述85
3.3.2 SOS Windows調試器擴展87
3.4腳本調試92
3.4.1架構概述92
3.4.2在Visual Studio中調試腳本93
3. 5遠程調試95
3.5.1架構概述95
3.5.2 WinDbg中的遠程調試96
3.5.3 Visual Studio中的遠程調試99
3.6小結101

第4章事後調試102
4.1實時調試102
4.1.1你的第一個實時調試實驗102
4.1.2實時調試是如何工作的105
4.1.3使用Visual Studio作為實時調試器108
4.1.4運行時斷言和實時調試113
4.1.5會話0中實時調試113
4.2轉儲調試114
4.2.1用戶態轉儲文件自動生成114
4.2.2使用WinDbg調試器分析崩潰轉儲文件117
4.2. 3使用Visual Studio分析崩潰轉儲文件123
4.2.4手動生成轉儲文件124
4.2.5 “時間旅行”調試125
4.2.6內核態事後調試126
4.3小結128

第5章基礎擴展130
5.1非侵入式調試130
5.2數據斷點132
5.2.1深度分析用戶態和內核態數據斷點133
5.2.2清除內核態數據斷點135
5.2. 3執行數據斷點與代碼斷點136
5.2.4用戶態調試器數據斷點操作:C++全局對象和C運行時庫137
5.2.5內核態調試器數據斷點操作:等待進程退出139
5.2.6高級例子:誰在修改註冊表值141
5.3調試器腳本145
5.3.1使用調試器腳本重放命令145
5.3.2調試器偽寄存器146
5.3. 3在調試器腳本中解析C++模板名稱148
5.3.4腳本實踐:在內核調試器中列舉Windows服務進程149
5.4 WOW64調試150
5.4.1 WOW64環境150
5.4.2 WOW64進程調試151
5.5 Windows調試鉤子(GFLAGS) 154
5.5.1系統級與進程相關的NT全局標誌154
5.5.2 GFLAGS工具155
5.5.3調試器擴展命令!gflag 157
5.5.4用戶態調試器對NT全局標誌值的影響159
5.5.5映像文件執行選項鉤子159
5.6小結159

第6章代碼分析工具161
6.1靜態代碼分析161
6.1.1使用VC++靜態代碼分析捕獲你的第一個崩潰錯誤161
6.1.2 SAL註釋164
6.1.3其他靜態分析工具167
6.2運行時代碼分析169
6.2.1使用應用程序驗證器工具捕獲你的第一個錯誤170
6.2.2幕後花絮:操作系統中支持的校驗器172
6.2.3調試擴展命令!avrf 176
6.2.4應用程序校驗器作為質量保證工具179
6.3小結179

第7章專家調試技巧181
7.1基本技巧181
7.1.1等待一個調試器附加到目標182
7.1 .2加載DLL時中斷184
7.1.3調試進程啟動188
7.1.4調試子進程194
7.2更多有用的技巧203
7.2.1調試錯誤代碼故障203
7.2.2在第一次異常通知時中斷209
7.2.3凍結線程210
7.3內核態調試技巧212
7.3.1在用戶態進程創建時中斷212
7.3.2調試用戶態進程啟動215
7.3.3加載DLL時中斷216
7.3.4未處理SEH異常時中斷217
7.3.5凍結線程218
7.4小結220

第8章常見調試場景·第1部分222
8.1調試非法訪問222
8.1.1理解內存非法訪問222
8.1.2調試擴展命令!analyze 223
8.2調試堆破壞225
8.2.1調試本地堆破壞225
8.2.2調試託管(GC)堆破壞233
8.3調試棧破壞241
8.3.1基於棧的緩衝區溢出242
8.3.2在棧破壞分析中使用數據斷點243
8.3.3重構損壞棧的調用幀244
8.4調試棧溢出246
8.4.1理解棧溢出246
8 .4.2調試命令kf 247
8.5調試句柄洩露248
8.5.1句柄洩露例子249
8.5.2調試擴展命令!htrace 250
8.6調試用戶態內存洩露254
8.6.1使用應用程序驗證器工具檢測資源洩露254
8.6.2使用UMDH工具分析內存洩露257
8.6.3擴展策略:棧跟踪數據庫的自定義引用260
8.7調試內核態內存洩露262
8.7.1內核內存基礎知識262
8.7.2使用Pool Tagging調查內核態洩露263
8.8小結266

第9章常見調試場景·第2部分268
9.1調試資源競爭268
9.1.1共享狀態一致性錯誤269
9.1.2共享狀態生命週期管理錯誤273
9.1.3 DLL模塊生命週期管理錯誤281
9.2調試死鎖284
9.2.1 (鎖順序)Lock-Ordering死鎖285
9.2.2邏輯死鎖288
9.3調試訪問檢查問題292
9.3.1基本的NT安全模型292
9.3.2 Windows Vista的改進297
9.3.3結束300
9.4小結301

第10章調試系統內部機制302
10.1 Windows控制台子系統302
10.1.1 printf背後的魔力302
10.1.2 Windows UI事件的處理309
10.1.3 Ctrl+C信號的處理309
10.2系統調用剖析314
10.2.1用戶態一側的系統調用315
10.2.2轉換到內核態317
10.2.3內核態一側的系統調用318
10.3小結319

第三部分觀察和分析軟件的行為

第11章Xperf介紹323
11.1獲取Xperf 323
11.2你的第一個Xperf調查327
11.2.1制定一個調查策略328
11.2.2收集場景的ETW跟踪328
11.2.3分析收集到的ETW跟踪329
11.3 Xperf的優點和局限性339
11.4小結339

第12章ETW內幕341
12.1 ETW架構341
12.1.1 ETW設計原則342
12.1.2 ETW組件342
12.1.3特殊的NT內核日誌記錄會話343
12.1.4使用Xperf配置ETW會話344
12.2 Windows系統現有的ETW檢測347
12.2.1 Windows內核中的檢測347
12.2.2其他Windows組件中的檢測350
12.3理解ETW的Stack-Walk事件355
12.3.1啟用和查看內核提供者事件的棧跟踪355
12.3.2啟用和查看用戶提供者事件的棧跟踪358
12.3.3診斷ETW棧跟踪問題359
12.4在你的代碼中添加ETW記錄363
12.4.1 ETW事件剖析364
12.4.2使用ETW Win32 API記錄事件367
12 .5在ETW中跟踪引導過程370
12.5.1在引導過程中記錄內核提供者事件371
12.5.2在引導過程中記錄用戶提供者事件373
12.6小結375

第13章常見的跟踪場景376
13.1分析阻塞時間376
13.1.1 ETW的CSwitch和ReadyThread事件377
13.1.2使用Visual Studio 2010實施等待分析379
13.1.3使用Xperf實施等待分析384
13.2分析內存使用389
13.2.1分析目標進程中高級別的內存使用390
13.2.2分析NT堆內存使用391
13.2.3分析GC堆(.NET)內存使用395
13.3跟踪作為一個調試輔助403
13.3.1跟踪錯誤代碼失敗403
13.3.2跟踪系統內部機制407
13.4小結413

附錄A WinDbg用戶態調試快速啟動415
附錄B Windows內核態調試快速啟動428