數據結構
Module
EEClass
MD(Method Desc)
MT(Method desc Table)
Object
基本命令
- ? ? ~*e!clrstack
? ? ? 查看所有持有和等待鎖的線程(的下一條要執行的代碼)
- ? ? k
? ? ? 觀察非托管堆棧
- ? ? x <模塊名>!*<函數名>*
? ? ? 查看符號
?
- lm -f
?
? ? ??顯示已經載入的模塊及其完整路徑
?
?
- sxe <異常類型號>
?
? ? ? 發生指定異常時中斷
?
? 元命令
- .hh <命令名>
? ? ??打開幫助文檔,并顯示其命令的文檔索引
?
- .logopen /t/u <日志文件路徑>
?
? ? ??創建日志文件,將在windbg所有的輸出同時寫入此文件
?
- .chain
? ? ? 顯示已經載入的擴展模塊與擴展模塊搜索路徑鏈
- .loadby?<要加載的模塊名> <已經加載的模塊名>
?
? ? ??.Net 3.5版本及以下:.loadby sos mscorwks
? ? ? .Net 4.0:.loadby sos clr
? ? ? silverlight:.loadby sos coreclr
- ? ? .dump?/ma <full dmp文件路徑>
- ? ? .unload?
- ? ? .unloadall
- ? ? .help
- ? ? .time
? ? ? 看進程運行了多長時間
- ? ? vertarget
? ? ? 查看操作系統的信息
sos.dll擴展模塊命令
- !help
- !dumpstackobjects
? ? 顯示當前堆棧上的所有托管對象,包括本地變量與參數
- ? ? !threadpool
? ? 查看線程池的運行情況
- ? ??!runaway
? ? 查看線程運行了多長時間
?
- !gchandles
? ?查看gc handle的統計情況
- ? ? ~<線程序號> s
? ? 切換到指定線程
- ? ? !clrstack
? ? 顯示當前線程的托管堆棧(能顯示其代碼行),使用p參數顯示傳入參數,使用l參數顯示局部變量,使用a參數顯示兩者
- ? ? !dumpstack
? ? 同時顯示托管堆棧與非托管堆棧
- ?!ip2md <代碼地址>
? ? 獲取代碼地址處的MethodTable結構。!clrstack命令結果的IP列即為代碼地址。
- !DumpVC <MethodTable address> <address>
?? ? 顯示指定類實例的指定成員的值
- ? ??!eeheap -gc
? ??? 查看托管堆的總信息
- ? ? !dumpheap -min 200 -stat
? ? ? 獲取占用堆內存的各對象的統計信息
- ? ? !dumpheap -type Byte[] -min 200
? ? ? 查看各Byte數組占用堆內存的詳細信息
- ? ? !dumpheap -mt <MethodTable地址>
? ? ? 顯示托管堆中指定的MethodTable結構的那些對象的信息
- ? ? !gcroot <對象地址>
? ? ? 看對象引用關系
- ? ? !do <對象地址>?
? ? ? 查看對象的詳細信息
- ? ? !da <對象地址>
? ? ? 獲取數據對象的詳細信息
- ? ? !dso (DumpStackObjects)
? ? ??查看當前堆棧的所有對象
- !objsize
? ? ??查看對象的大小
?
- !FinalizeQueue
?
? ? ??查看終結對象隊列 ? ? ?
- ? ? !analyze -v
? ? ? 分析掛掉線程的詳細情形,錯誤原因
- ? ? !threads
? ? ? 看所有的線程統計情況,包括崩潰后各線程拋出的異常。第1列為WinDbg內置線程號(可使用“~<內置線程號>s”功能切換堆棧),第2列為托管線程號,第3列為系統線程號
- ? ? !syncblk
? ? ? 查看哪些線程拿到了鎖
- ? ? !pe
? ? ? 獲取當前堆棧拋出的異常信息
?
- ? ? !pe <異常類型的對象的地址>
? ? ? 格式化打印輸出指定Exception對象的信息
?
- !eestack -short -ee
? ? ? 顯示所有感興趣的(持有鎖的、被劫持以執行一個垃圾收集操作、正在托管代碼中執行)托管線程的堆棧
?
- !bpmd <模塊名> <命名空間名.類名.方法名>
?
? ? ?在指定的方法處下斷點。之后可以使用:
? ? ?!clrstack -a:查看當前的堆棧(帶參數信息)
? ? ?g:繼續執行至下一個斷點
?
- !name2ee <模塊名> <類型名或方法名>
? ? ?顯示指定模塊中指定類型或方法的 MethodTable 結構和 EEClass 結構
?
- !soe -create system.Exception -1
? ? ?當程序出現system.Exception后, 斷下來
psscor.dll擴展模塊命令
可從DebugDiag的安裝目錄獲取psscor2.dll、psscor4.dll
- ? !printDateTime
- ? !convertVTDateToDate
- ? !convertTicksToDate
- ? !printIPAdress
- ? !dumpXmlDocument
- ? !dumpCollection
- ? !dumpThreadConfig
- ? !dumpField
? ? 獲取類的字段值
- ? !dumpDataTables
? ? 獲取所有DataTable實例
- ? !dumpColumnNames
? ? 獲取指定DataTable的所有列名
- ? !aspxpages
- ? !dumpASPNETCache
- ? !dumpHttpRuntime
- ? !dumpRequestQueues
- ? !dumpRequestTable
- ? !dumpHistoryTable
- ? !dumpBuckets
- ? !GetWorkItems
?
?
解決mscordacwks.dll版本錯誤的問題
- 使用.cordll命令查看需要的版本
- 在本地建目錄A,并將其路徑加入windbg的符號搜索目錄路徑鏈的鏈首
-
從運行調試目標應用程序的機器上拷貝以下正確版本的DLL至目錄A:
- mscordacwks.dll(在客戶端機通過.cordll命令獲取其路徑):改成指定的文件名,然后后用.cordll -ve -u -l重新載入。
- SOS.dll:使用.load進行載入。
另外若要使用VS調試dmp文件,那將mscordbi.dll文件拷貝至應用程序所在目錄,以防止出現異常。
備注
- ? ? 若表現為界面死掉,就直接找UI線程(STA線程就一個)
- ? ? 堆棧分為本地堆棧與托管堆棧,線程號也有本地線程號與托管線程號
- ? ? 在64位的winodws上使用任務管理器獲取的dmp為64位,即使跑的是32位的應用程序,所以得使用windbg、adplus、debugdiag獲取
- ? ? 32位應用程序的dmp使用32位的windbg進行分析,64位應用程序的dmp使用64位的windbg
- ? ? 符號文件路徑:C:\Users\Administrator\Desktop\ConsoleApplication1t;SRV*C:\symbolscache*http://msdl.microsoft.com/download/symbols
- ? ? 使用VS分析.dmp文件時,注意另創建系統符號文件緩存目錄,否則下載過來的符號文件默認存儲在臨時目錄可能會被刪除。
- ? ? 使用!Threads可查看所有線程以及其類型,除了手動創建Thread的類型為MTA外,使用ThreadPool,Timer,Task創建的線程的類型皆為(Threadpool Worker)
- ? ? (堆)內存碎片可通過!dumpheap <起始地址(任意一塊free的地址)> <前面的地址>+<空間差>查看是由于什么對象造成的碎片
- ? ? 使用WinDbg打開dmp文件后直接運行“!analyze -v”,WinDbg會自動載入sos.dll。
- ? ? 若要使用WinDbg為Windows Api下斷點,必須先載入其符號文件(如user32.pdb,可以將其直接指向到vs所使用的符號文件目錄),可使用“x user!*”查看符號文件中所有的函數,并且注意下斷點時一定要寫上符號文件名
- ? ? 句柄(IntPtr)是指針的指針,保存著目標對象的內存地址,可使用dd命令查看(取前4個字節表示的第一個地址)
- ? ? System.Threading.Thread對象的ManagedThreadId在線程消亡后是可以被重新使用的,所以當檢查到SynchronizationContext中的托管線程號指向到一個線程,并不表示SynchronizationContext一定是此線程創建的。
參考
?
PSSCor2: Object Inspection Commands, Part 1
?
PSSCor2: Object Inspection Commands, Part 2
?
Debugging Tools for Windows: The psscor2 Managed Code Debugger Extension
?
SOS.dll(SOS 調試擴展)
?
SOS.dll (SOS Debugging Extension)
?? Investigating Memory Issues
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
