Windbg調試學習

一、爲什麼學習使用Windbg調試

Windbg是在windows平臺下,強大的用戶態和內核態調試工具。相比較於Visual Studio,它是一個輕量級的調試工具,所謂輕量級指的是它的安裝文件大小較小,但是其調試功能,卻比VS更爲強大。它的另外一個用途是可以用來分析dump數據。

(以上截取自百度百科,其實說白了就是因爲工作中用到了才學習的。。。。。)

二、windbg的環境配置

參考 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windows-debugging

 

三、栗子

首先找到一個你要解析的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 結構情況

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章