生成minidump目的是保存程序異常時的調用棧信息,便于尋找問題原因。
1, 添加下面得函數,
#include <dbghelp.h>
#include <shellapi.h>
#include <shlobj.h>
LONG WINAPI GenerateDump(struct _EXCEPTION_POINTERS *pExceptionPointers)
{
LONG ret = EXCEPTION_EXECUTE_HANDLER;
BOOL bMiniDumpSuccessful;
TCHAR szPath[MAX_PATH];
TCHAR szFileName[MAX_PATH];
TCHAR* szAppName = TEXT(“AppName”);
TCHAR* szVersion = TEXT(“v1.0″);
DWORD dwBufferSize = MAX_PATH;
HANDLE hDumpFile;
SYSTEMTIME stLocalTime;
MINIDUMP_EXCEPTION_INFORMATION ExpParam;
GetLocalTime( &stLocalTime );
GetTempPath( dwBufferSize, szPath );
_stprintf( szFileName, TEXT(“%s%s”), szPath, szAppName );
CreateDirectory( szFileName, NULL );
_stprintf( szFileName, TEXT(“c:\\aaaa.dmp”));
hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
ExpParam.ThreadId = GetCurrentThreadId();
ExpParam.ExceptionPointers = pExceptionPointers;
ExpParam.ClientPointers = TRUE;
bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);
int i = GetLastError();
HRESULT hr = HRESULT_FROM_WIN32(i);
return ret;
}
2,在project setting中加入dbghelp.lib作為library的input,這是MiniDumpWriteDump需要的。在Debug Information Format設置Program Database (/Zi)。設置Generate Debug Info為Yes (/DEBUG)。在Optimization設置References為 Eliminate Unreferenced Data (/OPT:REF)。設置 Enable COMDAT Folding為 Remove Redundant COMDATs (/OPT:ICF)。后面兩項設置可以大大縮小exe文件大小。
3,使用如下:
void SomeFunction()
{
int *pBadPtr = NULL;
*pBadPtr = 0;
}
void Ctest2Dlg::OnBnClickedButton1()
{
__try
{
SomeFunction();
}
__except(GenerateDump(GetExceptionInformation()))
{
}
}
4,使用windbg打開dmp文件,就可以看到出錯時的call stack了。
幾點要注意的:1)網上有文章介紹使用 SetUnhandledExceptionFilter設置異常過濾,保證出現異常時能調用minidump函數,但是這有些問題,這個函數會導致debugger失效,而且好像跟drwatson有些沖突,感覺用起來比較危險。在程序的關鍵部分加入__try – __exception,這樣縮小捕捉范圍,應該就足夠用了。2)必須是用__try – __exception這樣的形式,才能保證GetExceptionInformation()能正常使用。3)MiniDumpWithDataSegs這個參數我試著換成另外幾個,好像都不好用。返回值都是0,經過解析lasterror都是E_INVALIDARG,奇怪。
update: 關于使用windbg
windbg下載地址在這里http://www.microsoft.com/whdc/devtools/debugging/debugstart.mspx
下載安裝最新版本即可,我沒有搞清楚的一點是必須要設置windows的symbol目錄,否則光有pdb是沒法看到調用棧信息的。
使用windbg過程如下:安裝。然后打開菜單file-> symbol file path,添加如下
srv*c:\symbol_local*http://msdl.microsoft.com/download/symbols;c:\debug
其中srv*c:\symbol_local*http://msdl.microsoft.com/download/symbols;指明從網上下載操作系統使用的symbol存放到c盤symbol_local目錄,另外程序的symbol(pdb文件)可以放在c盤debug目錄下。
windbg會顯示一段時間busy或者retrieving..,然后就可以看到詳細的dump信息了
posted on 2010-10-13 16:35
我風 閱讀(888)
評論(0) 編輯 收藏 引用