聲明:轉載自 http://community.studyez.com/blogs/silentacorn/archive/2007/06/23/dump.aspx
在生産環境下進行故障診斷時,為了不終止正在運作的服務或應用程式,有兩種方式可以對正在運作的服務或應用程式的程序進行分析和調試。
首先一種比較直覺簡潔的方式就是用WinDbg等調試器直接attach到需要調試的程序,調試完畢之後再detach即可。但是這種方式有個缺點就是執 行debugger指令時必須先break這個程序,執行完debug指令之後又得趕緊F5讓他繼續運作,因為被你break住的時候意味着整個程序也已 經被你挂起。另外也經常會由于First Chance Excetpion而自動break,你得時刻留意避免長時間break整個程序。是以這樣的調試方式對時間是個很大的考驗,往往沒有充裕的時間來做仔細 分析。
另一種方式則是在出現問題的時候,比如CPU持續長時間100%,記憶體突然暴漲等非正常情況下,通過對服務程序snapshot抓取一個dump檔案,完成dump之後先deatch,讓程序繼續運作。然後用windbg等工具來分析這個抓取到的dump檔案。
那麼如何在不終止程序的情況下抓取dump檔案呢?Debugging Tools for Windows裡提供了一個非常好的工具,adplus.vbs。從名字可以看出,實際上是一個vb腳本,隻是對cdb調試器作的一個包裝腳本。
其路徑與Debugging Tools for Windows的安裝路徑相同,使用的方法也很簡單,如下所示:
adplus.vbs -hang -p 1234 -o d:/dump
其中-hang指明使用hang模式,亦即在程序運作過程中附加上去snapshot抓取一個dump檔案,完成之後detach。與之對應的是 -crash崩潰模式,使用者先啟動adplus,然後由它啟動要監控的程式,在出現異常崩潰時自動生成dump檔案,或者通過Ctrl-C人為發出抓取指 令。但是-crash模式在抓取完成之後,被監控的程序就必須終止。是以我們在這裡隻選用-hang模式。
-p是要調試的程序ID,比如ASP.NET應用線程池,在Win2003下就是w3wp.exe
-o 指定要output的dump檔案路徑。
另外,與adplus類似的,有個UserDump工具,但是抓取使用者模式的程序,而adplus則是核心模式和使用者模式兩者皆可。
而總所周至的Dr. Waston,則會在程序崩潰之後的自動時候抓取dump檔案,一樣可以用于windbg等調試器來事後分析程式崩潰時的狀态。