1. 引入篇
1.1 下載安裝
1.2 調試器
1.3 操作界面
2. 命令篇
2.1 按照來源划分
2.1.1 基本命令
2.1.2 元命令
2.1.3 擴展命令
2.2 按照功能划分
2.2.1 系統信息
2.2.2 進程
2.2.3 模塊
2.2.4 符號
2.2.5 線程
2.2.6 內存
2.2.7 事件
3. 探討篇
3.1方法內聯
3.2 字符串駐留池
記一次內存泄漏DUMP分析:http://www.cnblogs.com/LoveOfPrince/p/6032523.html
高CPU、數據庫無法讀寫的真凶:https://www.cnblogs.com/LoveOfPrince/p/6991054.html
1. 引入篇
引入篇
1.1 下載安裝
1.2 調試器
1.3 操作界面
所謂技術分享,其實是一個自我總結和相互學習、不斷成長的過程。
考慮到之前原創的文章http://www.cnblogs.com/LoveOfPrince/p/6032523.html《記一次內存泄漏DUMP分析》被轉載,而且有的沒有說明出處,這里所有的圖片都打了標記,不好意思啊。
1.1 下載安裝
WinDbg是微軟發布的一款免費而十分強大的調試工具,從官網下載Microsoft Windows SDK,選擇安裝“Debugging Tools for Windows”。
1.2 調試器
安裝目錄下,有四個調試器程序。
cdb.exe和 ntsd.exe只支持用戶模式調試;Kd.exe主要用於內核調試,有時候也用於用戶模式。上述三者只能在控制台界面以命令行形式工作。
Windbg.exe采用可視化的用戶界面,支持用戶模式和內核模式調試。在兩種模式下,都支持實時調試模式和事后調試模式。另外,還支持源碼級的調試。
1.3 操作界面
2. 命令篇
命令篇
2.1 按照來源划分
2.2 按照功能划分
2.1 按照來源划分
按照來源划分
2.1.1 基本命令
2.1.2 元命令
2.1.3 擴展命令
2.1.1 基本命令
用?查看基本命令
2.1.2 元命令
用.help查看元命令
2.1.3 擴展命令
用.chain查看擴展模塊,再查看指定模塊下的所有擴展命令
2.2 按照功能划分
按照功能划分
2.2.1 系統信息
2.2.2 進程
2.2.3 模塊
2.2.4 符號
2.2.5 線程
2.2.6 內存
2.2.7 事件
2.2.1 系統信息
為了下載和本地系統匹配的符號,可用如下命令查看本地系統信息。
這里列出了操作系統版本、系統持續運行時間、調試時間等信息。
2.2.2 進程
WinDbg能夠同時調試多個進程。可以直接附加已經存在的進程,也可以創建新的進程並附加上去。 需要先切換到目標進程,檢查當前進程的環境信息,以確認是否切換成功。 最后,結束對當前進程的調試。
查看進程信息,以及包含的程序域。
2.2.3 模塊
模塊信息相關的命令。
列出了當前調試進程要加載的模塊符號信息,將指定模塊保存為程序集,反編譯看看效果還不錯,不過有些變量名不是能直接看懂的。
比如查看模塊鏡像文件重定位信息,可以發現基本上都是最優的。也可以查看PE頭信息研究一下。
2.2.4 符號
在創建二進制鏡像文件時,伴生的后綴名為.dbg、.sym或.pdb的文件稱為符號文件,包含如下符號信息:
1)源文件路徑以及每個符號的行號。
2)變量的名字和地址。
3)函數名稱、地址及其原型。
4)幀指針優化數據。
5)變量、結構等的類型信息。
符號路徑用於告訴調試器去哪里尋找符號文件,調試過程中,只有正確設置了符號路徑,使得調試器能夠將調試目標、符號文件以及源碼文件一一對應起來,才能夠最好地發揮調試器的強大功用。
如果涉及到成千上萬個符號文件,以及同一個符號文件存在不同平台下的不同版本的時候,那么一一手動設置符號路徑肯定是不現實的,於是引入符號服務器的概念。符號服務器有一套命名規則,使得調試器能夠正確找到對應平台和版本的符號文件。
WinDbg訪問符號需要兩個文件(SYMSRV.DLL 和 SYMSTORE.EXE),需要設置系統變量告訴他這兩個文件放在什么地方。
2.2.5 線程
查看線程的基本信息。
比如列出所有(托管)線程。
線程號是由調試器軟件內部維護的線程ID值,是一個從0開始的整數,在外部是沒有太大意義的。
線程ID是系統維護的系統唯一的ID值。
線程的凍結狀態,決定了是否分發CPU時間給它。
查看線程的堆棧信息。
查看線程的時間信息,包括三個方面:自創建之初到現在的總消耗時間、用戶模式執行時間、內核模式執行時間。
除了耗時,還可以查看線程池的信息。
2.2.6 內存
內存是存儲數據、代碼的地方,通過內存查看命令可以分析很多問題。通過查看堆上的大對象,以及對象的持有者,了解沒有被回收的原因等。
通過查看堆上的大對象,以及對象的持有者,了解沒有被回收的原因等。
2.2.7 事件
Windbg是事件驅動的。
比如程序故障分析,電腦藍屏故障分析等。
查看C盤確實發現百度瀏覽器目錄,卸載百度殺毒、刪除C盤百度瀏覽器(也可清理下注冊表),重啟電腦,恢復正常。
3. 探討篇
探討篇
3.1方法內聯
3.2 字符串駐留池
3.1方法內聯
默認情況下,Release版本進行了各種優化,其中,將被調用方法的方法主體移入調用方的主體,就可以避免某些方法的調用開銷,這一操作稱為方法內聯。
可以發現,DoCalc方法被內聯,而Calc方法卻不會。這里提到一個問題,什么是優秀的代碼,我的理解是除了讓人看的舒服,還要更貼近編譯優化后的代碼。
3.2 字符串駐留池
程序啟動時,系統域中的駐留池負責管理被駐留的字符串。抓取DUMP分析,查找這些字符串的根,發現都在一個object數組中,查看這個數組,果然是駐留池。
引用架構師修煉中的一段話:
發現問題永遠都比解決問題更加重要。一般來說,從問題暴露的點,一點點去溯源查找,一定會找出來誰的問題,以及是什么問題。
最壞情況就是當我們時間或者能力有限,實在是無法定位出是誰的問題的時候,比如系統出故障,也就意味着我們無法根本解決問題。這時最好的辦法就是去降低問題發生所帶來的成本,盡量去隔離問題影響的范圍,留出時間和空間去識別真正的問題。