自己創建 minidump
以前曾寫過一個 bugslayer.dll 的介紹. 在程序出錯時將調用棧寫到文件. 覺得不錯. 后來開始用 windbg. 知道了 userdump. 知道了如何調試 dump... 才知道程序崩潰的時候寫 dump 文件其實可以獲取比調用棧多得多的信息.
如果你的程序什么都不干. 那么在程序出錯的時候. drwtsn32.exe 會寫一個 userdump. 但 drwtsn32 有些缺點. 比如只能寫一個 dump 文件. 后面的崩潰寫 dump 文件時會覆蓋前面的. win2000 下的 drwtsn32 只能寫舊式的 dump 文件(往往尺寸比較大). 有一篇文章論述的比較清楚:
http://www.debuginfo.com/articles/ntsdwatson.html
建議使用 ntsd 代替 drwtsn32. 但 ntsd 的缺點就是需要安裝最新的 windbg. 這是一個硬傷. 在看了 debuginfo.com 的另一篇文章:
http://www.debuginfo.com/articles/effminidumps.html
之后, 我選擇的是在程序出錯的時候調用 api 自己寫 minidump. 克服了 drwtsn32, ntsd 的缺點.
將封裝好的函數放到了一個頭文件中, 包含即可. 使用的方法很簡單:
#include <windows.h>
#include "minidump.h"
LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
CreateMiniDump(pExceptionInfo, "c:\\user.dmp");
return EXCEPTION_EXECUTE_HANDLER;
}
void main()
{
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
*(int*)0=0; // AV
}
這樣就好了. 注意安裝至少 xp 以上的 sdk.
這里用到了一個 api SetUnhandledExceptionFilter(), 如果不明白可以搜一下 msdn.
運行例子程序出錯退出之后, 就得到了 c:\\user.dmp. 可以用 windbg 等調試器來分析了.
代碼從這里下載 http://nicoster.googlepages.com/minidump.rar
posted on 2009-10-21 18:50 肥仔 閱讀(1132) 評論(0) 編輯 收藏 引用 所屬分類: 調試