一、爲什麼學習使用Windbg調試
Windbg是在windows平臺下,強大的用戶態和內核態調試工具。相比較於Visual Studio,它是一個輕量級的調試工具,所謂輕量級指的是它的安裝文件大小較小,但是其調試功能,卻比VS更爲強大。它的另外一個用途是可以用來分析dump數據。
(以上截取自百度百科,其實說白了就是因爲工作中用到了才學習的。。。。。)
二、windbg的環境配置
三、栗子
首先找到一個你要解析的dmp文件,別問哪來的,說了是工作中用到的。。。。
然後打開windbg,會看到
然後點擊file的Open Crash Dump,選擇要解析的dmp文件,然後得到
圖上的四個圈圈是有點用但沒太大用的信息,其中第四個是運行時間;
之後最簡單的方法就是輸入:
!analyze -v
這條指令可以理解爲快速解析,一般只是偶爾查下閃退問題的會這個就夠了,於是得到:
得到上面的兩張圖,圖中圈起來的地方就是程序出問題的地方,1 3是位置,2 4是原因;
四、相關的一些指令
1.與內存相關的操作指令
!eeheap –gc:正是查看GC堆得命令,查看GC堆上的內存佔用是多大
!eeheap –loader:正是查看Loader堆得命令
!dumpheap –stat:就是GC堆上的統計,就看看GC堆上存活的對象是那些
!dumpheap -mt <<MethodTable address>>:查看該地址上的對象
!dumpheap –type:通過 type 參數查看內存中指定類型的對象
!gcroot +對象地址:這個命令就可以得到這個對象的"根"
!objsize +對象地址:查看對象佔用多大的內存
!name2ee TestClass.exe TestClass.Program.test ://顯示test方法相關的地址
!dumpmt -md 00976d48 ://得到類的成員函數詳細信息
!dumpmt:找到相關MethodTable處的相關信息。
!dumpmd:根據MethodDesc找到相關模塊信息,比如MethodTable.
!dumpdomain:顯示所有域裏的程序集,或者根據參數獲取指定域。
!dumpil 00973028:// 顯示這個方法被編譯器編譯之後的IL代碼
!dumpobj(do) 012a3904: //顯示一個對象的具體內容,看對象裏面有什麼,值是什麼
!dumpmodule 1ee30010:查看某個模塊的詳細信息
!DumpArray: //查看數組信息
2.與CPU相關的操作指令
!threadpool:查看線程池CPU使用量,我認爲WEB的比如iis應用程序池進程w3wp如果CPU使用過高,那查看線程池命令肯定看的出來過高,這個是我自己的理解,c/s的就不一定了。
!threads:查看所有託管線程情況
!clrstack:到具體某個線程後,本線程託管代碼的調用棧情況
~* e !clrstack:所有線程託管代碼的調用棧情況
!runaway:查看線程佔用CPU時間,可以從中找到哪個線程佔用時間更高。
~number s:number爲具體哪個線程的ID。
!dumpstackobjects(!dso):本線程調用棧所有對象實例
!dumpdomain:顯示所有域裏的程序集,或者根據參數獲取指定域。
!savemodule:根據具體程序集地址,把當前程序集的代碼生成到指定文件
!PrintException:顯示在當前線程上引發的最後一個異常錯誤信息
!StopOnException:在指定異常錯誤信息停止運行
!VerifyHeap:檢查垃圾回收器堆中是否有損壞跡象,並顯示找到任何錯誤
!SyncBlk –all:顯示所有SyncBlock 結構情況