Windbg常用命令及分析套路
自己也在使用windbg分析問題护奈,但是屬于剛入門所以轉發(fā)下大神的總結:https://www.cnblogs.com/fj365/p/13295453.html
常用
!threadpool 查看線程池CPU使用量
!threads 查看所有托管線程情況
!clrstack 某個線程托管代碼的調用棧情況
~*e!clrstack 所有線程托管代碼的調用棧情況
!runaway 查看線程占用CPU時間
~<number style="margin: 0px; padding: 0px;"> s 切換到指定線程(number為具體哪個線程的ID)</number>
!dumpstackobjects(!dso) 本線程調用棧所有對象實例
!dumpdomain 顯示所有域里的程序集泡嘴,或者根據參數獲取指定域。
!savemodule 根據具體程序集地址逆济,把當前程序集的代碼生成到指定文件
!PrintException(!pe) 顯示在當前線程上引發(fā)的最后一個異常錯誤信息
!VerifyHeap 檢查垃圾回收器堆中是否有損壞跡象酌予,并顯示找到任何錯誤
!SyncBlk –all 顯示所有SyncBlock 結構情況
查看對象
基本
!DumpObj <對象地址> 查看對象
!DumpArray <對象地址> 查看數組
!sosex.mdt <對象地址> 查看對象
!sosex.mdt -e <對象地址> 查看數組
!netext.wdo <對象地址> 查看對象
限定大小
!dumpheap -min <size1 bytes="" style="margin: 0px; padding: 0px;">-max <size2 bytes="" style="margin: 0px; padding: 0px;">查看大小在size1~size2的對象</size2></size1>
!dumpheap -min <size bytes="" style="margin: 0px; padding: 0px;">查看大于size字節(jié)的對象</size>
限定類型
!dumpheap -mt <methodtable address="" style="margin: 0px; padding: 0px;">-min <size1 bytes="" style="margin: 0px; padding: 0px;">-max</size1></methodtable>
查看MethodTable結構的對象
!dumpheap –type<partial type="" name="" style="margin: 0px; padding: 0px;"></partial>
查看類型名字子串匹配指定字符串的對象
限定地址范圍
!dumpheap start [end] 查看指定地址范圍的對象
查看內存
!eeheap -gc 查看GC堆,查看GC堆上的內存占用是多大
!eeheap –loader 查看Loader堆
!dumpheap –stat GC堆上的統(tǒng)計,看GC堆上存活的對象是那些
!dumpheap -mt <methodtable address="" style="margin: 0px; padding: 0px;">查看該地址上的對象</methodtable>
!dumpheap –type 通過 type 參數查看內存中指定類型的對象
!gcroot <對象地址> 得到這個對象的引用"根"
!objsize <對象地址> 查看對象占用多大的內存(不一定準)
!name2ee TestClass.exeTestClass.Program.test //顯示test方法相關的地址
!dumpmt -md 00976d48 //得到類的成員函數詳細信息
!dumpmt 找到相關MethodTable處的有關信息
!dumpmd 根據MethodDesc找到相關模塊信息,比如MethodTable.
!dumpdomain 顯示所有域里的程序集奖慌,或者根據參數獲取指定域抛虫。
!dumpil 00973028 顯示這個方法被編譯器編譯之后的IL代碼
!dumpmodule 1ee30010 查看某個模塊的詳細信息
檢查GC的終結隊列及線程
!FinalizeQueue 顯示為終結(finalization)而登記的所有對象。
重點看“Ready for finalization XX objexts”
!ThreadPool 顯示托管線程池的有關信息简僧。
如果“CPU utilization 81%”表示當前很可能在執(zhí)行GC回收建椰,此時Work Request in Queue會增長(因為CPU超過80%不會創(chuàng)建新線程)。
!Threads 顯示進程中所有的托管線程岛马。
關注Exception列棉姐,標記為“(Finalizer)”的表示這條為終結器線程、標記有“(GC)”的表示這條線程上在執(zhí)行GC操作啦逆、
查看線程調用
查看調用堆棧伞矩,然后進一步查看相關調用方法的參數,推斷調用邏輯夏志;
~<線程>e!clrstack 查線程調用堆棧
~*e!clrstack 查所有線程調用堆棧
~<線程>e!clrstack –a 查線程調用堆棧(含參數對象地址)
~<線程>e!dso 查線程上所有對象–>根據類型找到要查看對象的地址
!do <對象地址> 查看對象信息
!sosex.mdt–e <對象地址> 查看對象信息(數組)
查看異常
PrintException [-nested][<exception object="" address="" style="margin: 0px; padding: 0px;">]</exception>
-或者-
PE [-nested][<exception object="" address="" style="margin: 0px; padding: 0px;">]</exception>
編排格式并顯示在指定地址上的任何Exception類派生對象的字段乃坤。如果你沒有指定一個地址,PrintException命令顯示當前線程上最近拋出的異常沟蔑。
-nested 選項詳細顯示嵌套的異常對象湿诊。
你可以使用這個命令編排格式并查看_stackTrace字段,這是一個二元數組瘦材。
!analyze -v -hang
displays information about the currentexception or bug check.
.foreach (ex{!dumpheap -type Exception -short}){.echo“********************************”;!pe -nested ${ex} }
定位“鎖”
!sosex.dlk 檢查死鎖
!SyncBlk
擴展
sosex
http://www.stevestechspot.com/default.aspx
先創(chuàng)建堆上對象的索引!bhi
!mdt -e 00000000450bc560
netext
http://netext.codeplex.com/SourceControl/latest
Psscor4
https://www.microsoft.com/en-us/download/details.aspx?id=21255
編寫Windbg擴展
https://www.codeproject.com/Articles/6522/Debug-Tutorial-Part-Writing-WINDBG-Extensions