件是信息時代的主角,它已經對人類社會產生了巨大的影響,而且正在產生更大的 影響。如果你在做軟件方面的工作,那么你應該感覺很幸運;如果你在學習軟件,那么你選擇了前景無限廣闊的方向,一定要堅持。
回顧作者學習軟件的親身經歷,如果要分享經驗,那么第一條經驗就是多寫代碼,多調試。筆者一直覺得自己不是一個聰明的人,如果說作者的軟件技術學得還可以,那么靠的就是這條:幾乎每一天都寫代碼,幾乎每一天都高度,堅持了二十多年,已經成為了習慣。
2018年5月,軟件調試領域的“百科全書”《軟件調試(第2版)卷1》由人民郵電出版社出版,與第一版剛好間隔了10年。
本書堪稱是軟件調試的“百科全書”。作者圍繞軟件調試的“生態”系統(ecosystem)、異常(exception)和調試器 3 條主線,介紹軟件調試的相關原理和機制,探討可調試性(debuggability)的內涵、意義以及實現軟件可調試性的原則和方法,總結軟件調試的方法和技巧。
第1卷主要圍繞硬件技術展開介紹。全書分為4篇,共16章。第一篇“緒論”(第1章),介紹了軟件調試的概念、基本過程、分類和簡要歷史,并綜述了本書后面將詳細介紹的主要調試技術。第二篇“CPU及其調試設施”(第2~7章),以英特爾和ARM架構的CPU為例系統描述了CPU的調試支持。第三篇“GPU及其調試設施”(第8~14章),深入探討了Nvidia、AMD、英特爾、ARM和Imagination 這五大廠商的GPU。第四篇“可調試性”(第15~16章),介紹了提高軟件可調試性的意義、基本原則、實例和需要注意的問題,并討論了如何在軟件開發實踐中實現可調試性。
本書理論與實踐緊密結合,既涵蓋了相關的技術背景知識,又針對大量具有代表性和普遍意義的技術細節進行了討論,是學習軟件調試技術的寶貴資料。本書適合所有從事軟件開發工作的讀者閱讀,特別適合從事軟件開發、測試、支持的技術人員,從事反病毒、網絡安全、版權保護等工作的技術人員,以及高等院校相關專業的教師和學生學習參考。
第2版的卷1交稿后,作者便開始規劃卷2。卷2的主題是Windows平臺調試。加入英特爾后,雖然作者也時常作一些Linux平臺方面的工作,但是Windows平臺是“主場”,是作者最熟悉的平臺,作者的編程之路從Windows平臺開始,畢業之后最初十年里也主是在Windows平臺上工作。因為當作者規劃卷2時,想寫的內容很多。但考慮到篇幅有限制,筆者不得不反復篩選。篩選的最重要原則是“實用性”,特別是如下兩個指標。
經過多次調整,最后確定的卷2由五篇組成,共30章。
第一篇(第1—4章)介紹Windows平臺的發展歷史,進程和線程,架構和系統部件,以及啟動過程。目的是把作者對Windows平臺的總體認識分享給讀者,讓讀者對Windows平臺建立起一個總的認識,也就是大局觀。
第二篇(第5—8章)選擇Windows系統中非常有特色的幾個方面進行深入剖析,分別是特殊的調用過程,包括異步過程調用,延遲過程調用、本地過程調用和過程過程調用,用于解決應用于兼容問題的墊片機制,曾被給予厚望查實際讓人失望的.NET技術,以及具有時代特征的Linux子系統。
第三篇(第9—19章)介紹操作系統的調試支持。該篇的目標就是從不同角度呈現Windows平臺上的各種調試設施。先從用戶空間講起,介紹支持應用程序調試的調試模型和調試API以及用戶態調試過程,異常處理機制以及處置未處理異常的方法和過程。然后過渡到內核空間,介紹硬錯誤和藍屏。接著介紹全局性的錯誤報告、日志、事件追蹤和旨在記錄硬件錯誤的Windows硬件錯誤架構。最后介紹非常強大而且具有特色的內核調試引擎和驗證機制。
第四篇(第20—25章)介紹Windows平臺上的開發工具的調試支持,首先介紹編譯器的編譯期檢查和運行期檢查,然后解析棧的結構和函數調用的細節,最后解析堆的結構和調試支持、異常處理代碼的編譯過程以及調試符號。
第五篇(第26—30章)介紹調試器。調試器無疑是征服軟件世界最有力的武器。該篇首先概覽調試器的發展歷史和工作模型,然后分別介紹Windows平臺上的常用調試器,包括老牌的集成在Visual Studio環境中的VsDebug、新興的Visual Studio(VS)Code調試擴展,以及著名的WinDBG。
相對于讀者熟悉的第1版,第2版的變化主要如下。
既然你選擇了這本書,那么你多半是同意筆者的“軟件調試方法論”的,剩下的問題就是如何能比較快地學會高度技術。
張銀奎 著
張銀奎,國內知名的調試技術專家。畢業于上海交通大學信息與控制工程系,長期從事軟件開發和研究工作,曾在英特爾工作13 年,對 IA-32 架構、操作系統內核、驅動程序,尤其是對軟件調試有較深入的研究。著有《軟件調試》《格蠹匯編》等暢銷、常銷技術圖書,格蠹科技(xedge.ai)創始人,高端調試網站(advdbg.org)創建者。翻譯(合譯)作品有《二十一世紀機器人》《觀止——微軟創建NT 和未來的奪命狂奔》《數據挖掘原理》《機器學習》《人工智能:復雜問題求解的結構和策略》等。
第 一篇 大 局 觀
第 1 章 Windows 系統簡史
1.1 源于DOS
1.2 功在NT
1.3 Windows 2000 彰顯實力
1.4 巔峰之作:Windows XP 和Windows Server 2003
1.5 Windows Vista 折戟沙場
1.6 Windows 7 享利中興
1.7 Windows 8 革新受挫
1.8 Windows 10 何去何從
1.9 本章總結 17
參考資料
第 2 章 進程和線程
2.1 任務
2.2 進程資源
2.3 進程空間
2.3.1 32 位進程空間
2.4 EPROCESS 結構
2.5 PEB.... 28
2.6 內核模式和用戶模式
2.7 線程
2.8 WoW 進程
2.9 創建進程
2.10 最小進程和Pico 進程
2.11 任務管理器
2.12 本章總結
參考資料
第3 章 架構和系統部件
3.1 系統概覽
3.2 內核和HAL 模塊
3.3 空閑進程
3.4 系統進程
3.5 內核空間的其他模塊
3.6 NTDLL.DLL
3.7 環境子系統
3.8 原生進程
3.8.1 特點
3.8.2 SMSS
3.8.3 CSRSS
3.9 本章總結
參考資料
第4 章 啟動過程
4.1 BootMgr
4.2 WinLoad
4.3 內核初始化
4.4 執行體的階段0 初始化
4.5 執行體的階段1 初始化
4.6 創建用戶空間
4.7 本章總結
參考資料
第二篇 探 微
第5 章 特殊的過程調用
5.1 異步過程調用
5.2 中斷請求級別
5.3 延遲過程調用
5.4 本地過程調用
5.5 遠程過程調用
5.6 本章總結
參考資料
第6 章 墊片
6.1 墊片數據庫
6.2 AppHelp
6.3 墊片動態庫
6.4 應用程序墊片的工作過程
6.5 內核墊片引擎
6.6 本章總結
參考資料
第7 章 托管世界
7.1 簡要歷史
7.2 宏偉藍圖
7.3 類和方法表
7.4 輔助調試線程
7.5 CLR4 的調試模型重構
7.6 SOS 擴展
7.7 本章總結
參考資料
第8 章 Linux子系統
8.1 源于Drawbridge
8.2 融入NT
8.3 總體架構
8.4 子系統內核模塊
8.5 微軟版Linux 內核
8.6 Linux 子系統服務器
8.7 WSL 啟動器
8.8 交叉開發
8.9 WSL2
8.10 本章總結
參考資料
第三篇 操作系統的調試支持
第9 章 用戶態調試模型
9.1 概覽
9.1.1 參與者
9.2 采集調試消息
9.3 發送調試消息
9.4 調試子系統服務器(Windows XP 之后)
9.5 調試子系統服務器(Windows XP 之前)
9.6 比較兩種模型
9.7 NTDLL.DLL 中的調試支持例程
9.8 調試API
9.9 本章總結
參考資料
第 10 章 用戶態調試過程
10.1 調試器進程
10.2 被調試進程
10.3 從調試器中啟動被調試程序
10.4 附加到已經啟動的進程中
10.5 處理調試事件
10.6 中斷到調試器
10.7 輸出調試字符串
10.8 終止調試會話
10.9 本章總結
參考資料
第 11 章 中斷和異常管理
11.1 中斷描述符表
11.2 異常的描述和登記
11.3 異常分發過程
11.4 結構化異常處理
11.5 向量化異常處理
11.6 本章總結
參考資料
第 12 章 未處理異常和JIT 調試
12.1 簡介
12.2 默認的異常處理器
12.3 未處理異常過濾函數
12.4 “應用程序錯誤”對話框
12.5 JIT 調試和Dr. Watson
12.6 頂層異常過濾函數
12.7 Dr. Watson
12.8 DRWTSN32 的日志文件
12.9 用戶態轉儲文件
12.10 本章總結
參考資料
第 13 章 硬錯誤和藍屏
13.1 硬錯誤提示
13.2 藍屏終止
13.3 系統轉儲文件
13.4 分析系統轉儲文件
13.5 輔助的錯誤提示方法
13.6 配置錯誤提示機制
13.7 防止濫用錯誤提示機制
13.8 本章總結
參考資料
第 14 章 錯誤報告
14.2 系統錯誤報告
14.4 WER 2.0
14.5 CER
14.6 本章總結
參考資料
第 15 章 日志
15.1 日志簡介
15.2 ELF 的架構
15.3 ELF 的數據組織350
15.4 查看和使用ELF 日志
15.5 CLFS 的組成和原理
15.6 CLFS 的使用方法
15.7 本章總結
參考資料
第 16 章 事件追蹤
16.1 簡介
16.2 ETW 的架構
16.3 提供ETW消息
16.4 控制ETW會話
16.5 消耗ETW消息
16.6 格式描述
16.7 NT 內核記錄器
16.8 Global Logger Session
16.9 Crimson API
16.10 本章總結
參考資料
第 17 章 WHEA
17.1 目標、架構和PSHED.DLL
17.2 錯誤源
17.3 錯誤處理過程
17.4 錯誤持久化
17.5 注入錯誤
17.6 本章總結
參考資料
第 18 章 內核調試引擎
18.1 概覽
18.2 連接
18.3 啟用
18.4 初始化
18.5 內核調試協議
18.5.7 KdTalker
18.6 與內核交互
18.7 建立和維持連接
18.8 本地內核調試
18.9 本章總結
參考資料
第 19 章 驗證機制
19.1 簡介
19.2 驅動驗證器的工作原理
19.3 使用驅動驗證器
19.4 應用程序驗證器的工作原理
19.5 使用應用程序驗證器
19.6 本章總結
參考資料
第四篇 編譯器的調試支持
第 20 章 編譯和編譯期檢查
20.1 程序的構建過程
20.2 編譯
20.3 Visual C++編譯器
20.4 編譯錯誤和警告
20.5 編譯期檢查
20.6 標準標注語言
20.7 本章總結
參考資料.
第 21 章 運行時庫和運行期檢查
21.1 C/C++運行時庫
21.2 鏈接運行時庫
21.3 運行時庫的初始化和清理
21.4 運行期檢查
21.5 報告運行期檢查錯誤
21.6 本章總結
參考資料
第 22 章 棧和函數調用
22.1 簡介
22.2 棧的創建過程
22.3 CALL 和RET 指令
22.4 局部變量和棧幀
22.5 幀指針省略
22.6 棧指針檢查
22.7 調用協定
22.8 ??臻g的增長和溢出
22.9 棧下溢
22.10 緩沖區溢出
22.11 變量檢查
22.12 基于Cookie 的安全檢查
22.13 本章總結
參考資料
第 23 章 堆和堆檢查
23.1 理解堆
23.2 堆的創建和銷毀
23.3 分配和釋放堆塊
23.4 堆的內部結構
23.5 低碎片堆
23.6 堆的調試支持
23.7 ?;厮輸祿?
23.8 堆溢出和檢測
23.9 頁堆
23.10 準頁堆
23.11 CRT 堆
23.12 CRT 堆的調試堆塊
23.13 CRT 堆的調試功能
23.14 堆塊轉儲
23.15 泄漏轉儲
23.16 本章總結
參考資料
第 24 章 異常處理代碼的編譯
24.1 概覽
24.2 FS:[0]鏈條
24.3 遍歷FS:[0]鏈條
24.4 執行異常處理函數
24.5 _ _ try{}_ _ except()結構
24.6 安全問題
24.7 本章總結
參考資料
第 25 章 調試符號
25.1 名稱修飾
25.2 調試信息的存儲格式
25.3 目標文件中的調試信息
25.4 PE 文件中的調試信息
25.5 DBG 文件
25.6 PDB 文件
25.7 有關的編譯和鏈接選項
25.8 PDB 文件中的數據表
25.9 本章總結
參考資料
第五篇 調 試 器
第 26 章 調試器概覽
26.2 小型機和DDT調試器
26.3 個人計算機和它的調試器
26.3.3 CodeView調試器
26.3.4 Turbo Debugger
26.3.5 SoftICE
26.4 調試器的功能
26.5 分類標準
26.6 實現模型
26.7 經典架構
26.8 HPD 標準
26.9 本章總結
參考資料
第 27 章 VsDebug
27.1 架構和調試模型
27.2 VS 調試引擎
27.3 工作過程
27.4 使用斷點
27.5 多線程調試
27.6 EnC
27.7 設計期調試
27.8 使用符號服務器
27.9 定制調試事件
27.10 本章總結
參考資料
第 28 章 VS Code 的調試擴展
28.1 簡介
28.2 四大技術
28.3 理解“擴展包”
28.4 擴展包API
28.5 調試模型
28.6 調試適配器
28.7 機器接口
28.8 調試Python 程序
28.9 本章總結
參考資料
第 29 章 WinDBG 及其實現
29.1 WinDBG 溯源
29.2 C 階段的架構
29.3 重構
29.4 調試器引擎的架構
29.5 調試目標
29.6 調試會話
29.7 接收和處理命令
29.8 擴展命令的工作原理
29.9 本章總結
參考資料
第30 章 WinDBG 用法詳解
30.1 工作空間
30.2 命令概覽
30.3 用戶界面
30.4 輸入和執行命令
30.5 建立調試會話
30.6 終止調試會話
30.7 理解上下文
30.8 調試符號
30.9 事件處理
30.10 控制調試目標
30.11 單步執行
30.12 使用斷點
30.13 控制進程和線程
30.14 觀察棧
30.15 分析內存
30.16 遍歷鏈表
30.17 調用目標程序的函數
30.18 命令程序
30.19 本章總結
參考資料
附錄A 示例程序列表
附錄B WinDBG 標準命令列表
附錄C NT 內核部件縮寫列表
持之若癡——代跋
伙伴們我們每天都在用電腦,電腦和手機已經離不開了,可以說手機和電腦就是我們的左膀右臂。我們用電腦的時候,如果電腦卡了或者反應慢了,我們都會想到吧任務管理器調出來看看,可以說調出任務管理器就像醫生看病一樣,方便我們查看電腦哪里出了問題,出了什么問題,該怎么解決問題。
調出任務管理器有幾種方式。1.是按ctrl+atl+del 2 是ctrl+shift+esc 3.是在電腦任務欄右鍵選擇任務管理器 4.是在運行里面輸入taskmgr.exe 常見這4中打開任務管理器方式。
下面我們來了解任務管理器吧。
1.第一頁應用程序
紅色指示的是表示我們正在運行的有窗口我們可以看到的程序。這些我們任務可以很方便的結束他們。也就是關閉他們。
如果你開了多個窗口就可以看到多條應用程序,顯示他們正在運行中 。
2.第二頁是進程,可以勾選顯示所有用戶的進程,你會看到很多進程,有我們打開的也有相同自身打開的,在這個頁面可以看到進程占用內存的大小和消耗的處理器,如果想看看誰多占用了內存 ,一目了然。找到占用內存大戶,結束進程。結束進程的時間要看看是不是系統自身的進程,我們不太懂的話不要結束系統的進程,可能會藍屏重啟的哦。有一些是安全軟件的進程,那些是結束不掉的,他們為了保護電腦,不讓在這里結束進程。我們可以手動找到安全軟件退出就行了。
3.第三頁是服務。這個頁面可以看到系統里面的所有服務,查看他們的狀態。系統服務是比較專業的,等伙伴們有更多的知識之后也是可以隨便操作的。
4.第四個頁面就是性能頁面了。這里可以青春的看到你電腦的內存是多大,你的電腦是幾核的你的內存還剩下多少。還能看到更多的信息,比如有多少句柄,有多少活動線程,等等。對我們的電腦性能了然于心。當然了你們也會看到,我的這個筆記本是性能不怎么好的,才2個核心。
5.第五頁面是聯網。這里可以看到我們有幾個網絡適配器,我們的內網網絡是10M的,還是100M的,或者是1G的。
6.這個頁面可能有人認為沒啥用。但是我要說的是,這個頁面很有用的。任務管理器是win系統的標配,在win 服務器系統上比如 server2012 server 2008上,我們可以看到有沒有別人進入我們的電腦。如果有兩個人登錄了我們的服務器,在這個頁面就會出現兩個。當然在win7上不大可能會有兩個人登錄我們的電腦。
如果真有人入侵了我們的服務器那就選擇那個用戶,果斷的選擇斷開它。然后查找那個用戶,更改密碼,殺毒和打補丁。配置嚴格的防火墻讓他有來無回。
好了。寫了那么多,伙伴們對任務管理器應該有個深刻的了解了吧。多研究研究,你會有更多的收獲,不久你也會是電腦高手的。