【性能診斷】五、並發場景的性能分析(windbg簡介及dump抓取)


windbg簡介

      Windbg是在windows平台下,強大的用戶態和內核態調試工具。相比較於Visual Studio,它是一個輕量級的調試工具,所謂輕量級指的是它的安裝文件大小較小,但是其調試功能,卻比VS更為強大。它的另外一個用途是可以用來分析dump數據。哈哈,這是我們最需要的,可以用來分析並發測試場景或生產環境的性能及穩定性問題。它能夠通過dump文件輕松的定位到問題根源,學會使用它,將有效提升我們的問題解決能力和效率。

windbg版本和符合表

  1. 不同版本的程序需要對應版本的抓取工具及windbg版本;
    windbg下載地址,x86位版本下載:【微軟官方安裝版】 x64位版本下載:【微軟官方安裝版
  2. 符號表是WinDbg關鍵的“數據庫”,WinDbg必須依賴對應的符合表才能分析出問題原因。配置起來也很簡單:File->Symbol File Path  將符號表地址粘貼在輸入框中,點擊確定即可。
    符號表地址:SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols

image

配置好了以后,就可以使用windbg打開一個dump文件試試看。File->Open Crash Dump (Ctrl + D)

windbg常用命令

命令 說明
.loadby sos clr  加載調試擴展(.NET4.0以下使用mscorwks)
!threadpool or !tp 顯示有關托管線程池的信息
~* e!clrstack 顯示所有線程的堆棧
~* e!pe 顯示發生在所有線程上的最后的異常
!runaway 顯示線程耗費的CPU時間
!syncblk 查看程序阻塞
.logopen 記錄調試日志
vertarget 查看系統運行時間
!peb 查看完整的進程啟動的命令行參數,加載的DLL及環境變量等
!dml_proc 查看進程Id及進程全路徑名稱
lmvm clr 查看當前dump文件對應的framework版本
.cls 清屏
q 退出當前調試
!analyze -v 詳細顯示當前異常信息
~0s 切換到指定線程(中間的數字表示線程號)
!clrstack 查看線程的調用堆棧,僅提供托管代碼的堆棧跟蹤  參數 -p  顯示托管方法的參數值
!printexception 或 !pe 顯示當前活動線程上的最后一個異常
!dumpstackobjects 或 !dso 顯示在當前堆棧的邊界內找到的所有托管對象
!dumpobj <address>或者 !do 顯示對象信息,指定任何有效的對象地址,就能查看該對象的內容
!dumparray <address>或者!da 顯示數組信息
!gcroot -nostacks <address>    顯示對象內存引用;-nostacks 選項將搜索限制為垃圾回收器句柄和 Freachable對象
!dumpheap –stat 查看堆中的所有對象信息,包括類型信息,個數,大小等
!dumpheap -mt <MT Adress>   [-min ] 查看指定類型的對象及大小,可以指定最小、大值
!eeheap -gc | -loader 查看托管對象和程序結構在內存中占用情況
!address -summary 查看進程的內存分布情況,包括非托管內存
!ip2md  查看Method、Class及Module信息
!saveModule 從dump導出module到指定的磁盤目錄
.foreach (myobj{ !dumpheap -mt 008f4104 -short}) { !do ${myobj}} 輸出多個對象信息,該命令會對於堆中所有類型為008f4104的對象,依次調用!do命令

注意:

  1. 我們如果調試遠程發過來的dump文件,一般需要提供該機器的三個dll文件:sos.dll / clr.dll / mscordacwks.dll,注意32還是64位版本問題;
  2. 注意.NET版本:3.5以下使用 .loadby sos mscorwks ;.NET4.0使用 .loadby sos clr
  3. sos是一個dll,定義了很多針對.net assembly的調試命令,sos.dll針對不同的runtime有不同的版本。如果使用.load命令,需要為sos.dll指定完整路徑。
  4. sos擴展命令的完整列表:https://msdn.microsoft.com/en-us/library/bb190764(v=vs.110).aspx

抓取dump文件

      所謂的抓取dump,就是對進程的內存創建轉儲文件。抓取dump有很多方式和工具,我僅介紹自己常使用的,也是非常強大的命令行工具---ProcDump。它不但是綠色免費的、功能強大,而且沒有32、64位版本問題,它會根據目標進程的版本自動創建。

下載地址:https://technet.microsoft.com/en-us/sysinternals/dd996900

需要注意兩點:

  1. Procdump需要進程已經啟動,並且中途不能停止。比如需要抓取IIS的Dump,由於IIS默認會配置在20分鍾內沒有任何請求的話就會自動結束,因此如果目標程序存在這樣的配置,需要暫時將該配置取消。
  2. 在調試問題的時候經常用到的一個命令是!runaway,但是有些時候!runway在ProcDump抓取的dump中提取不出來。解決的方法是將Debug Tools for Windows (windbg)安裝目錄下的dbghelp.dll拷貝到procdump目錄下,然后再運行命令抓取dump。

常用的命令示例(可以使用PID或進程名):

  1. 立刻抓取fulldump
    procdump -ma w3wp.exe
  2. 連續抓取3個dump,時間間隔為2分鍾
    procdump -ma -s 120 -n 3 w3wp.exe
  3. 當CPU連續10秒鍾超過40%時抓取dump,總計抓取3個dump
    procdump -ma -c 40 -s 10 -n 3 w3wp.exe
  4. 抓取first chance exception,初次發生指定異常時抓取dump
    procdump -ma -e 1 –f SqlException w3wp.exe

我這里都是抓取的fulldump,注意存放dump文件的可用磁盤空間。准備工作做好以后,抓一個dump用windbg看看先微笑

image

image

接下來我會以線程阻塞、連接泄露等實例的方式進行展示,待續。。。

 

補充:抓取Crash dump時,還是需要使用windbg帶的命令行---adplus

      adplus -crash -pn w3wp.exe -fullonfirst -o d:\dumps
      此命令會通過監視進程w3wp.exe的運行,在當第一次出現異常時記錄一次完整的dump

      adplus -crash -pn w3wp.exe -o d:\dumps
      該命令也是在w3wp.exe崩潰時記錄dump,但這是一個mini dump


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM