Windbg學習筆記

下載winsdksetup.exe ,雙擊,選擇Debugging Tools for Windows安裝。windows

  • 64位系統抓64位進程dump,用64位windbg來分析。64位系統抓32位進程dump,用32位windbg來分析
  • 用VS命令行執行where sos.dll 找到sos.dll路徑
  • SOS does not support the current target architecture
    這個錯誤的緣由是用了32位的任務管理器抓的32位的dump文件。
    須要用64位的任務管理器抓32位的dump文件(C:\Windows\SysWOW64\taskmgr.exe)
  • lmf指令列出當前進程中加載的全部DLL文件和對應的路徑
  • lmvm 查看DLL/EXE文件信息,參數爲某個dll文件名稱
  • 使用.loadby sos mscorwks 指令用於加載.Net 3.5版本及如下模塊
  • 使用.loadby sos clr指令用於加載.Net 4.0版本及以上模塊
  • 指定symbol search path 設置符號服務器與符號緩存SRV*D:\symbols*http://msdl.microsoft.com/download/symbols
    也能夠在命令行執行
    .symfix d:\symbols
  • lmv mclr查看當前dump所需環境

The version of SOS does not match the version of CLR you are debugging?
根據dump來源系統版本從sos下載路徑找到對應版本的mscordacwks.dll、sos.dll下載到本地,並重命名爲mscordacwks.dll、sos.dll,在對應版本的Windbg的安裝路徑下建立目錄,好比下載的是4.0.30319.1026這個版本的sos.dll,就在目錄下建立clr1026文件夾,並將下載的文件放入該目錄,而後執行.load clr1026\sos.dll(注意目錄名),便可加載正確版本的sos。數組

經常使用命令

!help sos指令幫助
!threads 顯示全部線程
!threadpool(!tp) 顯示程序池信息
!ProcInfo 顯示進程信息
!dumpheap 顯示託管堆的信息
!dumpheap -stat 檢查當前全部託管類型的統計信息
!dumpheap -type Person –stat 在堆中查找指定類型(person)對象,注意大小寫敏感
!clrstack 顯示調用棧
!clrstack -p 顯示調用棧,同時顯示參數
!clrstack 只顯示託管代碼,而kb只顯示非託管代碼
!dumpobj(!do) 顯示一個對象的內容
!dumparray(!da) 顯示數組
!DumpStackObjects(!dso) 當前線程對象分配過程
!syncblk 顯示同步塊
!runaway 顯示線程cpu時間
!gcroot 跟蹤對象內存引用
!pe 打印異常
!ObjSize 查看對象大小 ObjSize 用於知道對象地址時,查看該對象的大小。
!GCRoot 是一個很是有用的命令,它可以幫助咱們發現某對象上目前還存在的有效引用。這也是爲何GC還不回收這個對象的緣由。這個信息能夠很好的幫助咱們分析那些本應該沒有引用,但卻一直還存在有效引用的對象,由此發現咱們代碼中潛在的內存泄漏,同時咱們也能夠觀察到哪些對象是目前沒有引用了。
~*k 結合~和k命令,來顯示全部線程的callstack
.cls 清屏
kb 顯示當前線程的callstack緩存

線程Hang住的常見緣由

-線程池或工做線程集中在某個耗時的工做當中,或者被其餘線程鎖住
核心問題,找到被hang住的線程
!threads
~* e!clrstack
!synblk服務器

CPU高

-若是與業務量沒有提高,有線程在長時間的處理
核心問題,找到佔用CPU的線程
!runaway 找到佔用CPU的線程
~*e!clrstack工具

線程死鎖出現的狀況:

兩個鎖A,B,
一個線程已經拿到鎖A,申請鎖B,
另外一個線程已經拿到鎖B,申請鎖A
核心問題:找到鎖定的線程
!threads
!syncblk
~*e!clrstackui

調試dump步驟

  1. 將dump文件拖入windbg
  2. 執行.loadby sos clr.loadby sos mscorwks加載模塊
  3. 執行!analyze -v 進行異常分析

調試exe文件步驟

  1. Open Executeable..
  2. 執行 sxe ld:clrjit
  3. 執行 g
  4. 執行.loadby sos clr

如何在IIS crash或者hang時候,dump 全部與IIS相關的memory?

當IIS發生crash或者hang以後,若是有必要獲取此刻的memory dump。咱們必須經過相應的debug tool來得到。相應工具不少。推薦的是windbg。安裝以後,在其folder下,有一個adplus.vbs腳本工具。命令行

  1. dump hang模式下的iis memory:
    在command console下面:
    key in: adplus -hang -iis -o c:\ Path_to_Put_Files_in -quiet
    則系統會listen iis。若是iis發生hang,那麼會自動收集與iis相關的memory保存至Path_to_Put_Files,而後exit.線程

  2. dump crash模式下的iis memory:
    在command console下面:
    key in: adplus -crash -iis -o c:\ Path_to_Put_Files_in -quiet
    則當iis crash的時候,系統會自動收集與iis相關的memery並保存至Path_to_Put_Files,而後exit.debug

!sym noisy
.reload調試

相關文章
相關標籤/搜索