買這商品的人也買了...
-
$650$507 -
$580$493 -
$780$663 -
$446PCI Express 體系結構導讀
-
$228$217 -
$800$720 -
$505自製編譯器
-
$594$564 -
$602Windows Sysinternals 實戰指南
-
$768$730 -
$1,188$1,129 -
$648$616 -
$450$356 -
$534$507 -
$980$882 -
$690$538 -
$880$695 -
$1,200$948 -
$1,194$1,134 -
$680$537 -
$270C/C++ 代碼調試的藝術
-
$779$740 -
$714$678 -
$834$792 -
$720$562
相關主題
商品描述
本書堪稱是軟件調試的“百科全書”。作者圍繞軟件調試的“生態”系統(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