使用Drwtsn32和NTSD進行崩潰進程轉儲
當我們的程序在客戶那裏崩潰時,使用崩潰轉儲工具獲取崩潰現場的信息是很有必要的,否則單純依賴用戶的口頭描述很難定位問題所在。Drwtsn32、NTSD,UserDump、Autodump+,WinDbg都是Windows下的崩潰轉儲工具,其原理就是在程序崩潰時獲取相應的信息並存儲。Drwtsn32和NTSD是Windows自帶的程序,客戶系統中一定存在這個程序,我們可以方便的使用它進行崩潰轉儲。我們也可以自己編寫一個類似的轉儲工具並註冊成系統默認的調試器。我們也可以在進程內使用SetUnhandledExceptionFilter中註冊一個ExceptionFilter函數,在這個函數中創建我們自己的轉儲工具生成轉儲信息。一般來說,當出現未處理的異常時,最好不要在ExceptionFilter函數中進行過多的處理並生成轉儲信息,因爲這時程序的堆、棧可能已經不可用了。
使用Drwtsn32進行崩潰進程轉儲
首先運行”Drwtsn32 –i”命令把Drwtsn32設置爲默認的調試器。然後運行Drwtsn32設置轉儲選項,一般使用默認的選項就行了。選項如下圖所示:
如果想在進程崩潰時得到通知可以選擇視覺通知和聲音通知。如果不選擇附加到現有日誌文件,則每次程序出錯都創建新的日誌文件,會把以前的日誌文件覆蓋,所以最好選擇附加到現有日誌文件。轉儲文件默認保持到“C:/Documents and Settings/All Users/Application Data/Microsoft/Dr Watson/user.dmp“,新生成的轉儲文件user.dmp會把以前的轉儲文件覆蓋,這是Drwtsn32非常不方便的一個地方,它不能爲每個文件生成一個唯一的文件名。
使用NTSD進行崩潰進程轉儲
NTSD是Windows 2k/XP自帶的調試器,雖然它的版本比較老(與最新的WinDbg附帶的版本相比),不過用來做崩潰進程轉儲已經夠用了。首先需要手工把NTSD設置爲默認的調試器,打開註冊表,
設置“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Debugger”爲
“c:/windows/system32/ntsd.exe -p %ld -e %ld -g -c ".dump /m /u D:/dump.dmp;q"”。
設置後轉儲文件會放在D盤根目錄下面,每個文件都有一個唯一的文件名,文件名格式是“dump_日期_時間_進程ID_.dmp”
設置“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Auto”爲1。.
NTSD命令參數的具體含義可以參考WinDbg的文檔。NTSD可以爲每個轉儲文件生成唯一的文件名,所以不用擔心文件互相覆蓋的問題。
有了轉儲文件我們就可以使用WinDbg或Visual Stdio慢慢分析了。