WinDbg調試.NET程序入門

俗話說:萬事開頭難!html

自歷來到新公司遇到性能問題後,須要想辦法解決這個問題,可是一直沒有合適的性能分析工具,而後找到StevenChennet 大神幫忙,他用WinDbg工具遠程幫我分析了一個 dump文件,可是隻看到鍵盤 「啪啪啪」,獲得告終果,卻不是很清楚WinDbg神奇具體如何使用的。結果,次日,性能問題又來了,總不能每次勞煩大神駕到,因此不得不本身開始學習WinDbg,這裏記錄一個入門過程。windows

1,首先,下載並安裝WinDbg程序

從下面的地址打開:
https://msdn.microsoft.com/en-us/windows/hardware/hh852365
而後看到
Standalone Debugging Tools for Windows (WinDbg)
下載。
安裝好後,在開始-》Windows Kits文件夾下有 WinDbg(x86),WinDbg(x64) 兩個程序的快捷方式,若是你要調試
64位的程序,就用WinDbg(x64)。sass

2,建立內存轉儲文件

能夠在任務管理器,進程-》建立轉儲文件 裏面,獲得當前進程的dump文件,我是用下面這個程序來生成轉儲文件的:
Procdump
下載地址:https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
有關 ProDump程序的使用,能夠參考下面2個博客文章:
High CPU Dump收集工具 - ProcDump使用方法服務器

介紹一個好用的抓取dump的工具-ProcDump app

在命令行,運行這個程序:工具

procdump -ma mydotNetApp.exe d:\myapp.dmp

運行後,將獲得一個myapp.dmp 文件,若是這個文件是在本機生成的,那麼VS2013能夠直接打開這個文件並能夠分析託管內存,可是,每每內存轉儲文件是 在服務器生成的,而服務器又極可能跟開發環境不同,因此才須要本文介紹的 WinDbg來調試。oop


3,配置調試環境


首先,打開咱們剛纔的轉儲文件,可使用菜單命令打開:
File->Open Crash Dump...
打開後,會顯示程序當時運行所在的環境,此時,會提示符號文件沒有發現:性能

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll - 

若是不配置,使用命令的時候會提示錯誤,好比:學習

0:000> .loadby sos clrjit
0:000> !tp
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for clr.dll - 

************* Symbol Loading Error Summary **************
Module name            Error
clr                    PDB not found : e:\appserver\symbols\dll\clr.pdb

e:\appserver 是個人dmp文件所在的目錄,它默認是到symbols 子目錄去找符號文件去了。spa

而後,配置下使用此文件的調試環境。
在菜單命令 File->Symbol path... 打開對話框,選擇瀏覽,找到dmp文件所在目錄相關的程序文件目錄 E:\AppServer ,該目錄下面有程序相關的 exe,pdb 文件。

輸入下面的命令:

0:000> .sympath+ c:\symbols
Symbol search path is: E:\AppServer;c:\symbols
Expanded Symbol search path is: e:\appserver;c:\symbols
Error: Attempts to access 'c:\symbols' failed: 0x2 - 系統找不到指定的文件。

************* Symbol Path validation summary **************
Response                         Time (ms)     Location
OK                                             E:\AppServer
Error 

這裏不用管,這個文件夾後面能夠生成。

0:000> .symfix
0:000> .symfix+ c:\symbols
0:000> .sympath
Symbol search path is: srv*
Expanded Symbol search path is: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

************* Symbol Path validation summary **************
Response                         Time (ms)     Location
Deferred  

這下對了。
執行下 reload命令:

0:000> .reload
................................................................
................................................................
............

接着執行下面:

0:000> .loadby sos clr
0:000> !tp
The version of SOS does not match the version of CLR you are debugging.  Please
load the matching version of SOS for the version of CLR you are debugging.
CLR Version: 4.0.30319.296
SOS Version: 4.6.96.0
Failed to load data access DLL, 0x80004005

這裏提示說SOS的版本更CLR不匹配,這裏須要找到當時生成Dump文件所在的服務器上的 sos.dll,注意,由於服務器程序是64位的,因此必須在 .Net Framework64 目錄去找,同時把 mscordacwks.dll 文件一塊兒拷貝過來(先暫時不用,下面立刻會講到)。

剛纔這個命令執行後,咱們驚喜的發現,c:\symbols 目錄本身建立了,而且下載了 clr.pdb等幾個目錄,這是再將剛纔服務器上拷貝的 sos.dll, mscordacwks.dll ,放到本地機器的 c:\symbols 目錄下面。

再次執行這幾個命令:

0:000> .reload
................................................................
................................................................
............
0:000> .loadby sos clr
0:000> !tp
The version of SOS does not match the version of CLR you are debugging.  Please
load the matching version of SOS for the version of CLR you are debugging.
CLR Version: 4.0.30319.296
SOS Version: 4.6.96.0
Failed to load data access DLL, 0x80004005

仍是報錯,看來 sos.dll 沒有加載正確,用下面的命令:

0:000> .load c:\symbols\sos.dll
0:000> .loadby sos clr
0:000> !tp

這裏load命令必須帶SOS.dll的路徑。加載了它,而後執行 .loadby sos clr ,表示調試.NET託管程序。

開始漫長的等待,程序窗口提示:

*BUSY*
Downloading symbols for [clr.pdb] /

等到相關的符號文件所有下載完畢,終於出現了久違的成功界面:

CPU utilization: 11%
Worker Thread: Total: 8 Running: 0 Idle: 8 MaxLimit: 32767 MinLimit: 8
Work Request in Queue: 0
--------------------------------------
Number of Timers: 14
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 16 CurrentLimit: 0 MaxLimit: 1000 MinLimit: 8

4,獲取幫助信息

有關WinDbg詳細的調試命名,能夠參考下面文章:
windbg調試命令
http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html

或者,你也能夠隨時用幫助,查看如何使用:

0:000> !help
-------------------------------------------------------------------------------
SOS is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function. 

Object Inspection                  Examining code and stacks
-----------------------------      -----------------------------
DumpObj (do)                       Threads
DumpArray (da)                     ThreadState
DumpStackObjects (dso)             IP2MD
DumpHeap                           U
DumpVC                             DumpStack
GCRoot                             EEStack
ObjSize                            CLRStack
FinalizeQueue                      GCInfo
PrintException (pe)                EHInfo
TraverseHeap                       BPMD 
                                   COMState

Examining CLR data structures      Diagnostic Utilities
-----------------------------      -----------------------------
DumpDomain                         VerifyHeap
EEHeap                             VerifyObj
Name2EE                            FindRoots
SyncBlk                            HeapStat
DumpMT                             GCWhere
DumpClass                          ListNearObj (lno)
DumpMD                             GCHandles
Token2EE                           GCHandleLeaks
EEVersion                          FinalizeQueue (fq)
DumpModule                         FindAppDomain
ThreadPool                         SaveModule
DumpAssembly                       ProcInfo 
DumpSigElem                        StopOnException (soe)
DumpRuntimeTypes                   DumpLog
DumpSig                            VMMap
RCWCleanupList                     VMStat
DumpIL                             MinidumpMode 
                                   AnalyzeOOM (ao)

Examining the GC history           Other
-----------------------------      -----------------------------
HistInit                           FAQ
HistRoot
HistObj
HistObjFind
HistClear

也可使用 .help命令,這個不同,這裏列出部分命令:

0:000> .help
. commands:
   .allow_exec_cmds [0|1] - control execution commands
   .allow_image_mapping [0|1] - control on-demand image file mapping
   .apply_dbp [<options>] - add current data breakpoint state to a
                            register context
   .asm [<options>] - set disassembly options
   .asm- [<options>] - clear disassembly options
   .attach <proc> - attach to <proc> at next execution
   .block { <commands> } - brackets a set of commands for nested execution
   .break - break out of the enclosing loop

也可以使用.hh命令:
 Use ".hh <command>" or open debugger.chm in the debuggers directory to get
detailed documentation on a command.

OK,有了dump文件生成,調試環境配置,還有幫助命令,如今總算是入門了。

相關文章
相關標籤/搜索