作 者:張銀奎 著
定 價:118
出 版 社:人民郵電出版社
出版日期:2016年12月01日
頁 數:485
裝 幀:平裝
ISBN:9787115492500
1. 軟件調試領域的“百科全書”,圍繞軟件調試的“生態”繫統(ecosystem)、異常(exception)和調試器三條主線,介紹軟件調試的相關原理和機制,探討可調試性(debuggability)的內涵、意義,以及實現軟件可調試性的原則和方法,總結軟件調試的方法和技巧;2. 設有“格物致知”實踐環節,提供配套資源,可供讀者動手實踐;3. 豐富的行業背景知識和人文故事,讓讀者體驗技術的有血有肉、有感情有溫度。第2版卷1新增內容如下:·關於CPU增加了ARM處理器的相關內容;等
●第 一篇 緒論第 1章 軟件調試基礎 31.1 簡介 31.1.1 定義 31.1.2 基本過程 51.2 基本特征 51.2.1 難度大 61.2.2 難以估計完成時間 71.2.3 廣泛的關聯性 71.3 簡要歷史 81.3.1 單步執行 81.3.2 斷點指令 101.3.3 分支監視 111.4 分類 121.4.1 按調試目標的繫統環境分類 121.4.2 按目標代碼的執行方式分類 121.4.3 按目標代碼的執行模式分類 131.4.4 按軟件所處的階段分類 131.4.5 按調試器與調試目標的相對位置分類 141.4.6 按調試目標的活動性分類 141.4.7 按調試工具分類 151.5 調試技術概覽 151.5.1 斷點 151.5.2 單步執行 161.5.3 輸出調試信息 171.5.4 日志 171.5.5 事件追蹤 171.5.6 轉儲文件 181.5.7 棧回溯 181.5.8 反彙編 181.5.9 觀察和修改內存數據 191.5.10 控制被調試進程和線程 191.6 錯誤與缺欠 191.6.1 內因與表像 191.6.2 誰的bug 201.6.3 bug的生命周期 211.6.4 軟件錯誤的開支曲線 211.7 重要性 231.7.1 調試與編碼的關繫 231.7.2 調試與測試的關繫 241.7.3 調試與逆向工程的關繫 241.7.4 學習調試技術的意義 251.7.5 調試技術尚未得到應有的重視 251.8 本章小結 26參考資料 26第二篇 CPU及其調試設施第 2章 CPU基礎 292.1 指令和指令集 292.1.1 基本特征 302.1.2 尋址方式 312.1.3 指令的執行過程 322.2 英特爾架構處理器 332.2.1 80386處理器 342.2.2 80486處理器 342.2.3 奔騰處理器 352.2.4 P6繫列處理器 362.2.5 奔騰4處理器 382.2.6 Core 2繫列處理器 382.2.7 Nehalem微架構 392.2.8 Sandy Bridge微架構 392.2.9 Ivy Bridge微架構 402.2.10 Haswell微架構 402.2.11 Broadwell微架構 412.2.12 Skylake微架構 412.2.13 Kaby Lake微架構 412.3 CPU的操作模式 422.4 寄存器 442.4.1 通用數據寄存器 442.4.2 標志寄存器 452.4.3 MSR寄存器 462.4.4 控制寄存器 462.4.5 其他寄存器 482.4.6 64位模式時的寄存器 492.5 理解保護模式 502.5.1 任務間的保護機制 502.5.2 任務內的保護 512.5.3 特權級 522.5.4 特權指令 532.6 段機制 542.6.1 段描述符 542.6.2 描述符表 562.6.3 段選擇子 562.6.4 觀察段寄存器 572.7 分頁機制 592.7.1 32位經典分頁 602.7.2 PAE分頁 662.7.3 IA-32e分頁 682.7.4 大內存頁 712.7.5 WinDBG的有關命令 722.8 PC繫統概貌 732.9 ARM架構基礎 752.9.1 ARM的多重含義 752.9.2 主要版本 762.9.3 操作模式和狀態 782.9.4 32位架構核心寄存器 802.9.5 協處理器 822.9.6 虛擬內存管理 832.9.7 偽段支持 872.9.8 64位ARM架構 882.10 本章小結 90參考資料 90第3章 中斷和異常 913.1 概念和差異 913.1.1 中斷 913.1.2 異常 933.1.3 比較 933.2 異常的分類 933.2.1 錯誤類異常 933.2.2 陷阱類異常 943.2.3 中止類異常 953.3 異常例析 953.3.1 列表 953.3.2 錯誤代碼 973.3.3 示例 973.4 中斷/異常的優先級 993.5 中斷/異常處理 1003.5.1 實模式 1003.5.2 保護模式 1013.5.3 IA-32e模式 1093.6 ARM架構中的異常機制 1103.7 本章小結 112參考資料 113第4章 斷點和單步執行 1144.1 軟件斷點 1144.1.1 INT 3 1144.1.2 在調試器中設置斷點 1154.1.3 斷點命中 1164.1.4 恢復執行 1184.1.5 特殊用途 1184.1.6 斷點API 1194.1.7 繫統對INT 3的優待 1194.1.8 觀察調試器寫入的INT 3指令 1214.1.9 歸納和提示 1224.2 硬件斷點 1234.2.1 調試寄存器概覽 1234.2.2 調試地址寄存器 1244.2.3 調試控制寄存器 1244.2.4 指令斷點 1274.2.5 調試異常 1274.2.6 調試狀態寄存器 1284.2.7 示例 1294.2.8 硬件斷點的設置方法 1324.2.9 歸納 1344.3 陷阱標志 1354.3.1 單步執行標志 1354.3.2 不錯語言的單步執行 1364.3.3 任務狀態段陷阱標志 1384.3.4 按分支單步執行標志 1384.4 實模式調試器例析 1404.4.1 Debug.exe 1404.4.2 8086 Monitor 1424.4.3 關鍵實現 1434.5 反調試示例 1454.6 ARM架構的斷點支持 1474.6.1 斷點指令 1484.6.2 斷點寄存器 1494.6.3 監視點寄存器 1534.6.4 單步跟蹤 1554.7 本章小結 156參考資料 157第5章 分支記錄和性能監視 1585.1 分支監視概覽 1595.2 使用寄存器的分支記錄 1595.2.1 LBR 1605.2.2 LBR棧 1615.2.3 示例 1615.2.4 在Windows操作繫統中的應用 1655.3 使用內存的分支記錄 1665.3.1 DS區 1665.3.2 啟用DS機制 1685.3.3 調試控制寄存器 1685.4 DS示例:CpuWhere 1695.4.1 驅動程序 1705.4.2 應用界面 1735.4.3 2.0版本 1755.4.4 局限性和擴展建議 1785.4.5 Linux內核中的BTS驅動 1795.5 性能監視 1805.5.1 奔騰處理器的性能監視機制 1815.5.2 P6處理器的性能監視機制 1825.5.3 P4處理器的性能監視 1835.5.4 架構性的性能監視機制 1865.5.5 酷睿微架構處理器的性能監視機制 1875.5.6 資源 1885.6 實時指令追蹤 1885.6.1 工作原理 1895.6.2 RTIT數據包 1905.6.3 Linux支持 1915.7 ARM架構的性能監視設施 1925.7.1 PMUv1和PMUv2 1925.7.2 PMUv3 1945.7.3 示例 1945.7.4 CoreSight 1955.8 本章小結 195參考資料 195第6章 機器檢查架構 1966.1 奔騰處理器的機器檢查機制 1966.2 MCA 1986.2.1 概覽 1986.2.2 MCA的全局寄存器 1996.2.3 MCA的錯誤報告寄存器 2016.2.4 擴展的機器檢查狀態寄存器 2026.2.5 MCA錯誤編碼 2036.3 編寫MCA軟件 2056.3.1 基本算法 2056.3.2 示例 2076.3.3 在Windows繫統中的應用 2086.3.4 在Linux繫統中的應用 2106.4 本章小結 212參考資料 212第7章 JTAG調試 2137.1 簡介 2137.1.1 ICE 2137.1.2 JTAG 2147.2 JTAG原理 2157.2.1 邊界掃描鏈路 2157.2.2 TAP信號 2167.2.3 TAP寄存器 2177.2.4 TAP控制器 2177.2.5 TAP指令 2187.3 JTAG應用 2197.3.1 JTAG調試 2207.3.2 調試端口 2217.4 IA處理器的JTAG支持 2217.4.1 P6處理器的JTAG實現 2217.4.2 探測模式 2237.4.3 ITP接口 2237.4.4 XDP端口 2257.4.5 ITP-XDP調試儀 2267.4.6 直接連接接口 2267.4.7 典型應用 2277.5 ARM處理器的JTAG支持 2277.5.1 ARM調試接口 2287.5.2 調試端口 2287.5.3 訪問端口 2297.5.4 被調試器件 2297.5.5 調試接插口 2297.5.6 硬件調試器 2317.5.7 DS-5 2327.6 本章小結 232參考資料 233第三篇 GPU及其調試設施第8章 GPU基礎 2378.1 GPU簡史 2378.1.1 從顯卡說起 2378.1.2 硬件加速 2398.1.3 可編程和通用化 2408.1.4 三輪演進 2428.2 設備身份 2438.2.1 “喂模式” 2438.2.2 內存復制 2438.2.3 超時檢測和復位 2438.2.4 與CPU之並立 2438.3 軟件接口 2448.3.1 設備寄存器 2448.3.2 批命令緩衝區 2458.3.3 狀態模型 2458.4 GPU驅動模型 2478.4.1 WDDM 2478.4.2 DRI和DRM 2498.5 編程技術 2508.5.1 著色器 2508.5.2 Brook和CUDA 2518.5.3 OpenCL 2528.6 調試設施 2528.6.1 輸出調試信息 2538.6.2 發布斷點 2538.6.3 其他斷點 2548.6.4 單步執行 2548.6.5 觀察程序狀態 2548.7 本章小結 254參考資料 255第9章 Nvidia GPU及其調試設施 2569.1 概要 2569.1.1 一套微架構 2569.1.2 三條產品線 2569.1.3 封閉 2579.2 微架構 2579.2.1 G80(特斯拉1.0微架構) 2579.2.2 GT200(特斯拉2.0微架構) 2599.2.3 GF100(費米微架構) 2609.2.4 GK110(開普勒微架構) 2619.2.5 GM107(麥斯威爾微架構) 2639.2.6 GP104(帕斯卡微架構) 2639.2.7 GV100(伏特微架構) 2659.2.8 持續改進 2679.3 硬件指令集 2689.3.1 SASS 2699.3.2 指令格式 2709.3.3 謂詞執行 2709.3.4 計算能力 2719.3.5 GT200的指令集 2719.3.6 GV100的指令集 2749.4 PTX指令集 2799.4.1 彙編和反彙編 2809.4.2 狀態空間 2829.4.3 虛擬寄存器 2839.4.4 數據類型 2849.4.5 指令格式 2849.4.6 內嵌彙編 2859.5 CUDA 2869.5.1 源於Brook 2869.5.2 算核 2869.5.3 執行配置 2889.5.4 內置變量 2909.5.5 Warp 2919.5.6 顯式並行 2929.6 異常和陷阱 2939.6.1 陷阱指令 2939.6.2 陷阱後綴 2939.6.3 陷阱處理 2939.7 繫統調用 2969.7.1 vprintf 2969.7.2 malloc和free 2979.7.3 __assertfail 2989.8 斷點指令 2999.8.1 PTX的斷點指令 2999.8.2 硬件的斷點指令 3009.9 Nsight的斷點功能 3019.9.1 源代碼斷點 3019.9.2 函數斷點 3019.9.3 根據線程組和線程編號設置條件斷點 3029.10 數據斷點 3049.10.1 設置方法 3049.10.2 命中 3049.10.3 數量 3069.10.4 設置時機 3069.11 調試符號 3069.11.1 編譯選項 3069.11.2 ELF載體 3069.11.3 DWARF 3079.12 CUDA GDB 3079.12.1 通用命令 3079.12.2 擴展 3089.12.3 局限 3089.13 CUDA調試器API 3089.13.1 頭文件 3099.13.2 調試事件 3099.13.3 工作原理 3109.14 本章小結 312參考資料 312第 10章 AMD GPU及其調試設施 31410.1 演進簡史 31410.1.1 三個發展階段 31410.1.2 兩種產品形態 31510.2 Terascale微架構 31510.2.1 總體結構 31510.2.2 SIMD核心 31710.2.3 VLIW 31710.2.4 四類指令 31810.3 GCN微架構 31810.3.1 邏輯結構 31910.3.2 CU和波陣 31910.3.3 內存層次結構 32110.3.4 工作組 32110.3.5 多執行引擎 32310.4 GCN指令集 32310.4.1 7種指令類型 32310.4.2 指令格式 32410.4.3 不再是VLIW指令 32410.4.4 指令手冊 32410.5 編程模型 32510.5.1 地幔 32510.5.2 HSA 32610.5.3 ROCm 32610.5.4 Stream SDK和APP SDK 32710.5.5 Linux繫統的驅動 32710.6 異常和陷阱 32710.6.1 9種異常 32810.6.2 啟用 32810.6.3 陷阱狀態寄存器 32810.6.4 陷阱處理器基地址 32910.6.5 陷阱處理過程 32910.7 控制波陣的調試接口 33010.7.1 5種操作 33010.7.2 指定目標 33010.7.3 發送接口 33110.7.4 33210.8 地址監視 33210.8.1 4種監視模式 33210.8.2 數量 33310.8.3 報告命中 33310.8.4 寄存器接口 33310.8.5 用戶空間接口 33310.9 單步調試支持 33310.9.1 單步調試模式 33410.9.2 控制方法 33410.10 根據調試條件實現分支跳轉的指令 33510.10.1 兩個條件標志 33510.10.2 4條指令 33510.11 代碼斷點 33510.11.1 陷阱指令 33610.11.2 在GPU調試SDK中的使用 33610.12 GPU調試模型和開發套件 33710.12.1 組成 33710.12.2 進程內調試模型 33710.12.3 面向事件的調試接口 33910.13 ROCm-GDB 34010.13.1 源代碼 34010.13.2 安裝和編譯 34010.13.3 常用命令 34010.14 本章小結 341參考資料 342第 11章 英特爾GPU及其調試設施 34311.1 演進簡史 34311.1.1 i740 34311.1.2 集成顯卡 34411.1.3 G965 34511.1.4 Larabee 34511.1.5 GPU 34611.1.6 第三輪努力 34711.1.7 公開文檔 34711.2 GEN微架構 34811.2.1 總體架構 34911.2.2 片區布局 35011.2.3 子片布局 35111.2.4 EU 35211.2.5 經典架構圖 35311.3 寄存器接口 35411.3.1 兩大類寄存器 35411.3.2 顯示功能的寄存器 35511.4 命令流和環形緩衝區 35711.4.1 命令 35711.4.2 環形緩衝區 35811.4.3 環形緩衝區寄存器 35911.5 邏輯環上下文和執行列表 36011.5.1 LRC 36011.5.2 執行鏈表提交端口 36211.5.3 理解LRC的提交和執行過程 36211.6 GuC和通過GuC提交任務 36511.6.1 加載固件和啟動GuC 36511.6.2 以MMIO方式通信 36611.6.3 基於共享內存的命令傳遞機制 36711.6.4 提交工作任務 36711.7 媒體流水線 36811.7.1 G965的媒體流水線 36811.7.2 MFX引擎 37011.7.3 狀態模型 37011.7.4 多種計算方式 37111.8 EU指令集 37211.8.1 寄存器 37211.8.2 寄存器區塊 37311.8.3 指令語法 37511.8.4 VLIW和指令級別並行 37511.9 內存管理 37711.9.1 GGTT 37711.9.2 PPGTT 37811.9.3 I915和GMMLIB 37911.10 異常 37911.10.1 異常類型 37911.10.2 繫統過程 38011.11 斷點支持 38111.11.1 調試控制位 38111.11.2 操作碼匹配斷點 38111.11.3 IP匹配斷點 38111.11.4 初始斷點 38211.12 單步執行 38211.13 GT調試器 38211.13.1 架構 38211.13.2 調試事件 38411.13.3 符號管理 38511.13.4 主要功能 38511.13.5 不足 38511.14 本章小結 386參考資料 386第 12章 Mali GPU及其調試設施 38712.1 概況 38712.1.1 源於挪威 38712.1.2 納入ARM 38712.1.3 三代微架構 38812.1.4 發貨最多的圖形處理器 38812.1.5 精悍的團隊 38912.1.6 封閉的技術文檔 38912.1.7 &nbs化設計 38912.2 Midgard微架構 38912.2.1 邏輯結構 39012.2.2 三流水線著色器核心 39012.2.3 VLIW指令集 39212.3 Bifrost微架構 39312.3.1 邏輯結構 39312.3.2 執行核心 39412.3.3 標量指令集和Warp 39512.4 Mali圖形調試器 39512.4.1 雙機模式 39512.4.2 面向幀調試 39612.5 Gator 39612.5.1 Gator內核模塊(gator.ko) 39712.5.2 Gator文件繫統(gatorfs) 39712.5.3 Gator後臺服務(gatord) 39812.5.4 Kbase驅動中的gator支持 39912.5.5 含義 39912.6 Kbase驅動的調試設施 39912.6.1 GPU版本報告 39912.6.2 編譯選項 40012.6.3 DebugFS下的虛擬文件 40112.6.4 SysFS下的虛擬文件 40112.6.5 基於ftrace的追蹤設施 40112.6.6 Kbase的追蹤設施 40212.7 其他調試設施 40312.7.1 Caiman 40312.7.2 devlib 40412.7.3 Mali離線編譯器 40412.8 缺少的調試設施 40512.8.1 GPGPU調試器 40512.8.2 GPU調試SDK 40612.8.3 反彙編器 40612.8.4 ISA文檔 40612.9 本章小結 406參考資料 406第 13章 PowerVR GPU及其調試設施 40713.1 概要 40713.1.1 發展簡史 40713.1.2 兩條產品線 40913.1.3 基於圖塊延遲渲染 40913.1.4 Intel GMA 40913.1.5 開放性 41013.2 Rogue微架構 41013.2.1 總體結構 41013.2.2 USC 41113.2.3 ALU流水線 41213.3 參考指令集 41313.3.1 寄存器 41413.3.2 指令組 41413.3.3 指令修飾符 41513.3.4 指令類型 41513.3.5 標量指令 41613.3.6 並行模式 41613.4 軟件模型和微內核 41713.4.1 軟件模型 41713.4.2 微內核的主要功能 41713.4.3 優點 41813.4.4 存在的問題 41813.5 斷點支持 41813.5.1 bpret指令 41913.5.2 數據斷點 41913.5.3 ISP斷點 42013.6 離線編譯和反彙編 42013.6.1 離線編譯 42013.6.2 反彙編 42113.7 PVR-GDB 42113.7.1 跟蹤調試 42113.7.2 寄存器訪問 42213.7.3 其他功能 42213.7.4 全局斷點和局限性 42213.8 本章小結 423參考資料 423第 14章 GPU綜述 42414.1 比較 42414.1.1 開放性 42414.1.2 工具鏈 42514.1.3 開發者文檔 42514.2 主要矛盾 42514.2.1 專用性和通用性 42614.2.2 強硬件和弱軟件 42614.3 發展趨勢 42614.3.1 從固定到通用執行引擎 42614.3.2 從向量指令到標量指令 42714.3.3 從指令並行到線程並行 42714.4 其他GPU 42714.4.1 Adreno 42814.4.2 VideoCore 42814.4.3 圖芯GPU 42914.4.4 TI TMS34010 42914.5 學習資料和工具 43014.5.1 文檔 43014.5.2 源代碼 43014.5.3 工具 43114.6 本章小結 432參考資料 432第四篇 可調試性第 15章 可調試性概覽 43515.1 簡介 43515.2 觀止和未雨綢繆 43615.2.1 NT 3.1的故事 43615.2.2 未雨綢繆 43815.3 基本原則 43915.3.1 最短距離原則 43915.3.2 最小範圍原則 43915.3.3 立刻終止原則 44015.3.4 可追溯原則 44115.3.5 可控制原則 44215.3.6 可重復原則 44215.3.7 可觀察原則 44215.3.8 易辨識原則 44315.3.9 低海森伯效應原則 44315.4 不可調試代碼 44415.4.1 繫統的異常分發函數 44415.4.2 提供調試功能的繫統函數 44415.4.3 對調試器敏感的函數 44515.4.4 反跟蹤和調試的程序 44515.4.5 時間敏感的代碼 44615.4.6 應對措施 44615.5 可調試性例析 44615.5.1 健康性檢查和BSOD 44715.5.2 可控制性 44715.5.3 公開的符號文件 44815.5.4 WER 44815.5.5 ETW和日志 44815.5.6 性能計數器 44915.5.7 內置的內核調試引擎 44915.5.8 手動觸發崩潰 44915.6 與安全、商業秘密和性能的關繫 44915.6.1 可調試性與安全性 45015.6.2 可調試性與商業秘密 45015.6.3 可調試性與性能 45015.7 本章小結 450參考資料 451第 16章 可調試性的實現 45216.1 角色和職責 45216.1.1 架構師 45216.1.2 程序員 45316.1.3 測試人員 45316.1.4 產品維護和技術支持工程師 45416.1.5 管理者 45416.2 可調試架構 45516.2.1 日志 45516.2.2 輸出調試信息 45616.2.3 轉儲 45716.2.4 基類 45816.2.5 調試模型 45816.3 通過棧回溯實現可追溯性 45916.3.1 棧回溯的基本原理 45916.3.2 利用DbgHelp函數庫回溯棧 46116.3.3 利用RTL函數回溯棧 46516.4 數據的可追溯性 46616.4.1 基於數據斷點的方法 46616.4.2 使用對像封裝技術來追蹤數據變化 47116.5 可觀察性的實現 47216.5.1 狀態查詢 47216.5.2 WMI 47316.5.3 性能計數器 47516.5.4 轉儲 47816.5.5 打印或者輸出調試信息 47916.5.6 日志 48016.6 自檢和自動報告 48016.6.1 BIST 48016.6.2 軟件自檢 48116.6.3 自動報告 48216.7 本章小結 482參考資料 483
本書堪稱是軟件調試的“百科全書”。作者圍繞軟件調試的“生態”繫統(ecosystem)、異常(exception)和調試器 3 條主線,介紹軟件調試的相關原理和機制,探討可調試性(debuggability)的內涵、意義以及實現軟件可調試性的原則和方法,總結軟件調試的方法和技巧。卷主要圍繞硬件技術展開介紹。全書分為4篇,共16章。篇“緒論”(章),介紹了軟件調試的概念、基本過程、分類和簡要歷史,並綜述了本書後面將詳細介紹的主要調試技術。第二篇“CPU及其調試設施”(第2~7章),以英特爾和ARM架構的CPU為例繫統描述了CPU的調試支持。第三篇“GPU及其調試設施”(第8~14章),深入探討了Nvidia、AMD、英特爾、ARM和Imagination 這五大廠商的GPU。第四篇“可調試性”(5~16章),介紹了提高軟件可調試性的意義、基本原則、實例和需要注意的問題,並討論了如何在軟件等
張銀奎 著
張銀奎,靠前知名的調試技術專家。畢業於上海交通大學信息與控制工程繫,長期從事軟件開發和研究工作,曾在英特爾工作13 年,對 IA-32 架構、操作繫統內核、驅動程序,尤其是對軟件調試有較深入的研究。著有《軟件調試》《格蠹彙編》等暢銷、常銷技術圖書, 格蠹科技(xedge.ai) 創始人,高端調試網站(advdbg.org)創建者。翻譯(合譯)作品有《二十一世紀機器人》《觀止——微軟創建NT和未來的奪命狂奔》《數據挖掘原理》《機器學習》《人工智能:復雜問題求解的結構和策略》等。