軟件調試 第2版 捲1:硬件基礎

張銀奎

  • 出版商: 人民郵電
  • 出版日期: 2018-12-01
  • 售價: $708
  • 貴賓價: 9.5$673
  • 語言: 簡體中文
  • 頁數: 485
  • 裝訂: 平裝
  • ISBN: 7115492506
  • ISBN-13: 9787115492500
  • 相關分類: 軟體測試
  • 立即出貨 (庫存 < 3)

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

商品描述

本書堪稱是軟件調試的“百科全書”。作者圍繞軟件調試的“生態”系統(ecosystem)、異常(exception)和調試器 3 條主線,介紹軟件調試的相關原理和機制,探討可調試性(debuggability)的內涵、意義以及實現軟件可調試性的原則和方法,總結軟件調試的方法和技巧。
第1捲主要圍繞硬件技術展開介紹。全書分為4篇,共16章。第一篇“緒論”(第1章),介紹了軟件調試的概念、基本過程、分類和簡要歷史,並綜述了本書後面將詳細介紹的主要調試技術。第二篇“CPU及其調試設施”(第2~7章),以英特爾和ARM架構的CPU為例系統描述了CPU的調試支持。第三篇“GPU及其調試設施”(第8~14章),深入探討了Nvidia、AMD、英特爾、ARM和Imagination 這五大廠商的GPU。第四篇“可調試性”(第15~16章),介紹了提高軟件可調試性的意義、基本原則、實例和需要註意的問題,並討論瞭如何在軟件開發實踐中實現可調試性。
本書理論與實踐緊密結合,既涵蓋了相關的技術背景知識,又針對大量具有代表性和普遍意義的技術細節進行了討論,是學習軟件調試技術的寶貴資料。本書適合所有從事軟件開發工作的讀者閱讀,特別適合從事軟件開發、測試、支持的技術人員,從事反病毒、網絡安全、版權保護等工作的技術人員,以及高等院校相關專業的教師和學生學習參考。

作者簡介

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

目錄大綱

第一篇緒論

第1章軟件調試基礎3 
1.1簡介3 
1.1.1定義3 
1.1.2基本過程5 
1.2基本特徵5 
1.2.1難度大6 
1.2.2難以估計完成時間7 
1.2.3廣泛的關聯性7 
1.3簡要歷史8 
1.3.1單步執行8 
1.3.2斷點指令10 
1.3.3分支監視11 
1.4分類12 
1.4.1按調試目標的系統環境分類12 
1.4.2按目標代碼的執行方式分類12 
1.4.3按目標代碼的執行模式分類13 
1.4.4按軟件所處的階段分類13 
1.4.5按調試器與調試目標的相對位置分類14 
1.4.6按調試目標的活動性分類14 
1.4.7按調試工具分類15 
1.5調試技術概覽15 
1.5.1斷點15 
1.5.2單步執行16 
1.5.3輸出調試信息17 
1.5.4日誌17 
1.5.5事件追踪17 
1.5.6轉儲文件18 
1.5. 7棧回溯18 
1.5.8反彙編18
1.5.9觀察和修改內存數據19 
1.5.10控制被調試進程和線程19 
1.6錯誤與缺欠19 
1.6.1內因與表象19 
1.6.2誰的bug 20 
1.6.3 bug的生命週期21 
1.6.4軟件錯誤的開支曲線21 
1.7重要性23 
1.7.1調試與編碼的關係23 
1.7.2調試與測試的關係24 
1.7.3調試與逆向工程的關係24 
1.7.4學習調試技術的意義25 
1.7.5調試技術尚未得到應有的重視25 
1.8本章小結26 
參考資料26 

第二篇CPU及其調試設施

第2章CPU基礎29 
2.1指令和指令集29 
2.1.1基本特徵30 
2.1.2尋址方式31 
2.1. 3指令的執行過程32 
2.2英特爾架構處理器33 
2.2.1 80386處理器34 
2.2.2 80486處理器34 
2.2.3奔騰處理器35 
2.2.4 P6系列處理器36 
2.2.5奔騰4處理器38 
2.2 .6 Core 2系列處理器38 
2.2.7 Nehalem微架構39
2.2.8 Sandy Bridge微架構39 
2.2.9 Ivy Bridge微架構40 
2.2.10 Haswell微架構40 
2.2.11 Broadwell微架構41 
2.2.12 Skylake微架構41 
2.2.13 Kaby Lake微架構41 
2.3 CPU的操作模式42 
2.4寄存器44 
2.4.1通用數據寄存器44 
2.4.2標誌寄存器45 
2.4.3 MSR寄存器46 
2.4.4控制寄存器46 
2.4.5其他寄存器48 
2.4.6 64位模式時的寄存器49 
2.5理解保護模式50 
2.5.1任務間的保護機制50 
2.5.2任務內的保護51 
2.5.3特權級52 
2.5.4特權指令53 
2.6段機制54 
2.6.1段描述符54 
2.6.2描述符表56 
2.6.3段選擇子56 
2.6.4觀察段寄存器57 
2.7分頁機制59 
2.7.1 32位經典分頁60 
2.7.2 PAE分頁66 
2.7.3 IA-32e分頁68 
2.7.4大內存頁71
2.7.5 WinDBG的有關命令72 
2.8 PC系統概貌73 
2.9 ARM架構基礎75 
2.9.1 ARM的多重含義75 
2.9.2主要版本76 
2.9.3操作模式和狀態78 
2.9.4 32位架構核心寄存器80 
2.9 .5協處理器82 
2.9.6虛擬內存管理83 
2.9.7偽段支持87 
2.9.8 64位ARM架構88 
2.10本章小結90 
參考資料90 
第3章中斷和異常91 
3.1概念和差異91 
3.1.1中斷91 
3.1.2異常93 
3.1.3比較93 
3.2異常的分類93 
3.2.1錯誤類異常93 
3.2.2陷阱類異常94 
3.2.3中止類異常95 
3.3異常例析95 
3.3.1列表95 
3.3. 2錯誤代碼97 
3.3.3示例97 
3.4中斷/異常的優先級99 
3.5中斷/異常處理100 
3.5.1實模式100 
3.5.2保護模式101 
3.5.3 IA-32e模式109 
3.6 ARM架構中的異常機制110
3.7本章小結112 
參考資料113 
第4章斷點和單步執行114 
4.1軟件斷點114 
4.1.1 INT 3 114 
4.1.2在調試器中設置斷點115 
4.1.3斷點命中116 
4.1.4恢復執行118 
4.1.5特殊用途118 
4.1.6斷點API 119 
4.1.7系統對INT 3的優待119 
4.1.8觀察調試器寫入的INT 3指令121 
4.1.9歸納和提示122 
4.2硬件斷點123 
4.2.1調試寄存器概覽123 
4.2.2調試地址寄存器124 
4.2.3調試控制寄存器124 
4.2.4指令斷點127 
4.2.5調試異常127 
4.2.6調試狀態寄存器128 
4.2.7示例129 
4.2.8硬件斷點的設置方法132 
4.2.9歸納134 
4.3陷阱標誌135 
4.3.1單步執行標誌135 
4.3.2高級語言的單步執行136 
4.3.3任務狀態段陷阱標誌138 
4.3.4按分支單步執行標誌138 
4.4實模式調試器例析140 
4.4.1 Debug.exe 140
4.4.2 8086 Monitor 142 
4.4.3關鍵實現143 
4.5反調試示例145 
4.6 ARM架構的斷點支持147 
4.6.1斷點指令148 
4.6.2斷點寄存器149 
4.6.3監視點寄存器153 
4.6.4單步跟踪155 
4.7本章小結156 
參考資料157 
第5章分支記錄和性能監視158 
5.1分支監視概覽159 
5.2使用寄存器的分支記錄159 
5.2.1 LBR 160 
5.2.2 LBR棧161 
5.2.3示例161 
5.2.4在Windows操作系統中的應用165 
5.3使用內存的分支記錄166 
5.3.1 DS區166 
5.3.2啟用DS機制168 
5.3.3調試控制寄存器168 
5.4 DS示例:CpuWhere 169 
5.4.1驅動程序170 
5.4.2應用界面173 
5.4.3 2.0版本175 
5.4.4局限性和擴展建議178 
5.4.5 Linux內核中的BTS驅動179 
5.5性能監視180 
5.5.1奔騰處理器的性能監視機制181
5.5.2 P6處理器的性能監視機制182 
5.5.3 P4處理器的性能監視183 
5.5.4架構性的性能監視機制186 
5.5.5酷睿微架構處理器的性能監視機制187 
5.5.6資源188 
5.6實時指令追踪188 
5.6.1工作原理189 
5.6.2 RTIT數據包190 
5.6.3 Linux支持191 
5.7 ARM架構的性能監視設施192 
5.7.1 PMUv1和PMUv2 192 
5.7.2 PMUv3 194 
5.7.3示例194 
5.7. 4 CoreSight 195 
5.8本章小結195 
參考資料195 
第6章機器檢查架構196 
6.1奔騰處理器的機器檢查機制196 
6.2 MCA 198 
6.2.1概覽198 
6.2.2 MCA的全局寄存器199 
6.2.3 MCA的錯誤報告寄存器201 
6.2.4擴展的機器檢查狀態寄存器202 
6.2.5 MCA錯誤編碼203 
6.3編寫MCA軟件205 
6.3.1基本算法205 
6.3.2示例207 
6.3.3在Windows系統中的應用208
6.3.4在Linux系統中的應用210 
6.4本章小結212 
參考資料212 
第7章JTAG調試213 
7.1簡介213 
7.1.1 ICE 213 
7.1.2 JTAG 214 
7.2 JTAG原理215 
7.2.1邊界掃描鏈路215 
7.2. 2 TAP信號216 
7.2.3 TAP寄存器217 
7.2.4 TAP控制器217 
7.2.5 TAP指令218 
7.3 JTAG應用219 
7.3.1 JTAG調試220 
7.3.2調試端口221 
7.4 IA處理器的JTAG支持221 
7.4.1 P6處理器的JTAG實現221 
7.4.2探測模式223 
7.4.3 ITP接口223 
7.4.4 XDP端口225 
7.4.5 ITP-XDP調試儀226 
7.4.6直接連接接口226 
7.4.7典型應用227 
7.5 ARM處理器的JTAG支持227 
7.5.1 ARM調試接口228 
7.5.2調試端口228 
7.5.3訪問端口229 
7.5.4被調試器件229 
7.5.5調試接插口229
7.5.6硬件調試器231 
7.5.7 DS-5 232 
7.6本章小結232 
參考資料233 

第三篇GPU及其調試設施

第8章GPU基礎237 
8.1 GPU簡史237 
8.1.1從顯卡說起237 
8.1. 2硬件加速239 
8.1.3可編程和通用化240 
8.1.4三輪演進242 
8.2設備身份243 
8.2.1 “餵模式” 243 
8.2.2內存複製243 
8.2.3超時檢測和復位243 
8.2.4與CPU之並立243 
8.3軟件接口244 
8.3.1設備寄存器244 
8.3.2批命令緩衝區245 
8.3.3狀態模型245 
8.4 GPU驅動模型247 
8.4.1 WDDM 247 
8.4.2 DRI和DRM 249 
8.5編程技術250 
8.5 .1著色器250 
8.5.2 Brook和CUDA 251 
8.5.3 OpenCL 252 
8.6調試設施252 
8.6.1輸出調試信息253 
8.6.2發布斷點253 
8.6.3其他斷點254
8.6.4單步執行254 
8.6.5觀察程序狀態254 
8.7本章小結254 
參考資料255 
第9章Nvidia GPU及其調試設施256 
9.1概要256 
9.1.1一套微架構256 
9.1.2三條產品線256 
9.1 .3封閉257 
9.2微架構257 
9.2.1 G80(特斯拉1.0微架構) 257 
9.2.2 GT200(特斯拉2.0微架構) 259 
9.2.3 GF100(費米微架構) 260 
9.2.4 GK110(開普勒微架構) 261 
9.2.5 GM107(麥斯威爾微架構) 263 
9.2.6 GP104(帕斯卡微架構) 263 
9.2.7 GV100(伏特微架構) 265 
9.2.8持續改進267 
9.3硬件指令集268 
9.3.1 SASS 269 
9.3.2指令格式270 
9.3.3謂詞執行270 
9.3.4計算能力271 
9.3.5 GT200的指令集271 
9.3.6 GV100的指令集274 
9.4 PTX指令集279 
9.4.1彙編和反彙編280 
9.4.2狀態空間282 
9.4.3虛擬寄存器283
9.4.4數據類型284 
9.4.5指令格式284 
9.4.6內嵌彙編285 
9.5 CUDA 286 
9.5.1源於Brook 286 
9.5.2算核286 
9.5.3執行配置288 
9.5.4內置變量290 
9.5.5 Warp 291 
9.5.6顯式並行292 
9.6異常和陷阱293 
9.6.1陷阱指令293 
9.6.2陷阱後綴293 
9.6.3陷阱處理293 
9.7系統調用296 
9.7.1 vprintf 296 
9.7.2 malloc和free 297 
9.7. 3 __assertfail 298 
9.8斷點指令299 
9.8.1 PTX的斷點指令299 
9.8.2硬件的斷點指令300 
9.9 Nsight的斷點功能301 
9.9.1源代碼斷點301 
9.9.2函數斷點301 
9.9. 3根據線程組和線程編號設置條件斷點302 
9.10數據斷點304 
9.10.1設置方法304 
9.10.2命中304 
9.10.3數量限制306 
9.10.4設置時機306
9.11調試符號306 
9.11.1編譯選項306 
9.11.2 ELF載體306 
9.11.3 DWARF 307 
9.12 CUDA GDB 307 
9.12.1通用命令307 
9.12.2擴展308 
9.12.3局限308 
9.13 CUDA調試器API 308 
9.13.1頭文件309 
9.13.2調試事件309 
9.13.3工作原理310 
9.14本章小結312 
參考資料312 
第10章AMD GPU及其調試設施314 
10.1演進簡史314 
10.1.1三個發展階段314 
10.1.2兩種產品形態315 
10.2 Terascale微架構315 
10.2.1總體結構315 
10.2.2 SIMD核心317 
10.2.3 VLIW 317 
10.2.4四類指令318 
10.3 GCN微架構318 
10.3.1邏輯結構319 
10.3.2 CU和波陣319 
10.3.3內存層次結構321 
10.3.4工作組321 
10.3.5多執行引擎323 
10.4 GCN指令集323
10.4.1 7種指令類型323 
10.4.2指令格式324 
10.4.3不再是VLIW指令324 
10.4.4指令手冊324 
10.5編程模型325 
10.5.1地幔325 
10.5.2 HSA 326 
10.5.3 ROCm 326 
10.5. 4 Stream SDK和APP SDK 327 
10.5.5 Linux系統的驅動327 
10.6異常和陷阱327 
10.6.1 9種異常328 
10.6.2啟用328 
10.6.3陷阱狀態寄存器328 
10.6.4陷阱處理器基地址329 
10.6. 5陷阱處理過程329 
10.7控制波陣的調試接口330 
10.7.1 5種操作330 
10.7.2指定目標330 
10.7.3發送接口331 
10.7.4限制332 
10.8地址監視332 
10.8.1 4種監視模式332 
10.8 .2數量限制333 
10.8.3報告命中333 
10.8.4寄存器接口333 
10.8.5用戶空間接口333 
10.9單步調試支持333 
10.9.1單步調試模式334
10.9.2控制方法334 
10.10根據調試條件實現分支跳轉的指令335 
10.10.1兩個條件標誌335 
10.10.2 4條指令335 
10.11代碼斷點335 
10.11.1陷阱指令336 
10.11.2在GPU調試SDK中的使用336 
10.12 GPU調試模型和開發套件337 
10.12.1組成337 
10.12.2進程內調試模型337 
10.12.3面向事件的調試接口339 
10.13 ROCm-GDB 340 
10.13.1源代碼340 
10.13.2安裝和編譯340 
10.13.3常用命令340 
10.14本章小結341 
參考資料342 
第11章英特爾GPU及其調試設施343 
11.1演進簡史343 
11.1.1 i740 343 
11.1.2集成顯卡344 
11.1.3 G965 345 
11.1.4 Larabee 345 
11.1.5 GPU 346 
11.1.6第三輪努力347 
11.1.7公開文檔347 
11.2 GEN微架構348 
11.2.1總體架構349 
11.2.2片區佈局350
11.2.3子片佈局351 
11.2.4 EU 352 
11.2.5經典架構圖353 
11.3寄存器接口354 
11.3.1兩大類寄存器354 
11.3.2顯示功能的寄存器355 
11.4命令流和環形緩衝區357 
11.4.1命令357 
11.4.2環形緩衝區358 
11.4.3環形緩衝區寄存器359 
11.5邏輯環上下文和執行列表360 
11.5.1 LRC 360 
11.5.2執行鍊錶提交端口362 
11.5.3理解LRC的提交和執行過程362 
11.6 GuC和通過GuC提交任務365 
11.6.1加載固件和啟動GuC 365 
11.6.2以MMIO方式通信366 
11.6.3基於共享內存的命令傳遞機制367 
11.6.4提交工作任務367 
11.7媒體流水線368 
11.7.1 G965的媒體流水線368 
11.7.2 MFX引擎370 
11.7.3狀態模型370 
11.7.4多種計算方式371 
11.8 EU指令集372 
11.8.1寄存器372 
11.8.2寄存器區塊373 
11.8.3指令語法375
11.8.4 VLIW和指令級別並行375 
11.9內存管理377 
11.9.1 GGTT 377 
11.9.2 PPGTT 378 
11.9.3 I915和GMMLIB 379 
11.10異常379 
11.10.1異常類型379 
11.10.2系統過程380 
11.11斷點支持381 
11.11.1調試控制位381 
11.11.2操作碼匹配斷點381 
11.11.3 IP匹配斷點381 
11.11.4初始斷點382 
11.12單步執行382 
11.13 GT調試器382 
11.13.1架構382 
11.13.2調試事件384 
11.13.3符號管理385 
11.13.4主要功能385 
11.13.5不足385 
11.14本章小結386 
參考資料386 
第12章Mali GPU及其調試設施387 
12.1概況387 
12.1.1源於挪威387 
12.1.2納入ARM 387 
12.1.3三代微架構388 
12.1.4發貨最多的圖形處理器388 
12.1.5精悍的團隊389
12.1.6封閉的技術文檔389 
12.1.7單元化設計389 
12.2 Midgard微架構389 
12.2.1邏輯結構390 
12.2.2三流水線著色器核心390 
12.2.3 VLIW指令集392 
12.3 Bifrost微架構393 
12.3.1邏輯結構393 
12.3.2執行核心394 
12.3.3標量指令集和Warp 395 
12.4 Mali圖形調試器395 
12.4.1雙機模式395 
12.4.2面向幀調試396 
12.5 Gator 396 
12.5.1 Gator內核模塊(gator. ko) 397 
12.5.2 Gator文件系統(gatorfs) 397 
12.5.3 Gator後台服務(gatord) 398 
12.5.4 Kbase驅動中的gator支持399 
12.5.5含義399 
12.6 Kbase驅動的調試設施399 
12.6.1 GPU版本報告399 
12.6.2編譯選項400 
12.6.3 DebugFS下的虛擬文件401 
12.6.4 SysFS下的虛擬文件401 
12.6.5基於ftrace的追踪設施401 
12.6.6 Kbase的追踪設施402
12.7其他調試設施403 
12.7.1 Caiman 403 
12.7.2 devlib 404 
12.7.3 Mali離線編譯器404 
12.8缺少的調試設施405 
12.8.1 GPGPU調試器405 
12.8.2 GPU調試SDK 406 
12.8.3反彙編器406 
12.8.4 ISA文檔406 
12.9本章小結406 
參考資料406 
第13章PowerVR GPU及其調試設施407 
13.1概要407 
13.1.1發展簡史407 
13.1.2兩條產品線409 
13.1.3基於圖塊延遲渲染409 
13.1.4 Intel GMA 409 
13.1.5開放性410 
13.2 Rogue微架構410 
13.2.1總體結構410 
13.2.2 USC 411 
13.2.3 ALU流水線412 
13.3參考指令集413 
13.3.1寄存器414 
13.3.2指令組414 
13.3.3指令修飾符415 
13.3.4指令類型415 
13.3.5標量指令416 
13.3.6並行模式416
13.4軟件模型和微內核417 
13.4.1軟件模型417 
13.4.2微內核的主要功能417 
13.4.3優點418 
13.4.4存在的問題418 
13.5斷點支持418 
13.5.1 bpret指令419 
13.5.2數據斷點419 
13.5.3 ISP斷點420 
13.6離線編譯和反彙編420 
13.6.1離線編譯420 
13.6.2反彙編421 
13.7 PVR-GDB 421 
13.7.1跟踪調試421 
13.7.2寄存器訪問422 
13.7.3其他功能422 
13.7.4全局斷點和局限性422 
13.8本章小結423 
參考資料423 
第14章GPU綜述424 
14.1比較424 
14.1.1開放性424 
14.1.2工具鏈425 
14.1.3開發者文檔425 
14.2主要矛盾425 
14.2.1專用性和通用性426 
14.2.2強硬件和弱軟件426 
14.3發展趨勢426 
14.3.1從固定功能單元到通用執行引擎426 
14.3.2從向量指令到標量指令427
14.3.3從指令並行到線程並行427 
14.4其他GPU 427 
14.4.1 Adreno 428 
14.4.2 VideoCore 428 
14.4.3圖芯GPU 429 
14.4.4 TI TMS34010 429 
14.5學習資料和工具430 
14.5.1文檔430 
14.5. 2源代碼430 
14.5.3工具431 
14.6本章小結432 
參考資料432 

第四篇可調試性

第15章可調試性概覽435 
15.1簡介435 
15.2觀止和未雨綢繆436 
15.2.1 NT 3.1的故事436 
15.2.2未雨綢繆438 
15.3基本原則439 
15.3.1最短距離原則439 
15.3.2最小範圍原則439 
15.3.3立刻終止原則440 
15.3.4可追溯原則441 
15.3.5可控制原則442 
15.3.6可重複原則442 
15.3.7可觀察原則442 
15.3.8易辨識原則443 
15.3.9低海森伯效應原則443 
15.4不可調試代碼444
15.4.1系統的異常分發函數444 
15.4.2提供調試功能的系統函數444 
15.4.3對調試器敏感的函數445 
15.4.4反跟踪和調試的程序445 
15.4.5時間敏感的代碼446 
15.4.6應對措施446 
15.5可調試性例析446 
15.5.1健康性檢查和BSOD 447 
15.5.2可控制性447 
15.5.3公開的符號文件448 
15.5.4 WER 448 
15.5.5 ETW和日誌448 
15.5.6性能計數器449 
15.5.7內置的內核調試引擎449 
15.5.8手動觸發崩潰449 
15.6與安全、商業秘密和性能的關係449 
15.6.1可調試性與安全性450 
15.6.2可調試性與商業秘密450 
15.6 .3可調試性與性能450 
15.7本章小結450 
參考資料451 
第16章可調試性的實現452 
16.1角色和職責452 
16.1.1架構師452 
16.1.2程序員453 
16.1.3測試人員453 
16.1.4產品維護和技術支持工程師454 
16.1.5管理者454
16.2可調試架構455 
16.2.1日誌455 
16.2.2輸出調試信息456 
16.2.3轉儲457 
16.2.4基類458 
16.2.5調試模型458 
16.3通過棧回溯實現可追溯性459 
16.3.1棧回溯的基本原理459 
16.3.2利用DbgHelp函數庫回溯棧461 
16.3.3利用RTL函數回溯棧465 
16.4數據的可追溯性466 
16.4.1基於數據斷點的方法466 
16.4.2使用對象封裝技術來追踪數據變化471 
16.5可觀察性的實現472 
16.5.1狀態查詢472 
16.5.2 WMI 473 
16.5.3性能計數器475 
16.5.4轉儲478 
16.5.5打印或者輸出調試信息479 
16.5.6日誌480 
16.6自檢和自動報告480 
16.6.1 BIST 480 
16.6.2軟件自檢481 
16.6.3自動報告482 
16.7本章小結482 
參考資料483