dbghelp.dll

windows的系统目录system32下,都有dbghelp.dll,但在实际使用时,往往会让exe加载自己目录下的dll,以避免系统目录下的dll版本不一导致的程序异常。

故一般都是用LoadLibrary()的方式加载Dll,先加载当前目录,不存在时加载系统目录。

HMODULE hDll = ::LoadLibrary(szDllPath);


MiniDumpWriteDump

该函数为DbgHelp.dll 导出函数,使用它生成dump文件。

BOOL WINAPI MiniDumpWriteDump(
  __in  HANDLE hProcess,
  __in  DWORD ProcessId,
  __in  HANDLE hFile,
  __in  MINIDUMP_TYPE DumpType,
  __in  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  __in  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  __in  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

通过 GetProcAddress() 获取 MiniDumpWriteDump() 函数指针,如下:

typedef BOOL (WINAPI* MINIDUMPWRITEDUMP)(
  HANDLE hProcess,
  DWORD ProcessId,
  HANDLE hFile,
  MINIDUMP_TYPE DumpType,
  PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
  PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
  PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);

MINIDUMPWRITEDUMP pFuncWriteDump = NULL;
pFuncWriteDump = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump");

创建dump文件File:

HANDLE hDump = CreateFile(szFileName, GENERIC_WRITE, 0, 
        NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

生成dump文件:

MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
    loExceptionInfo.ExceptionPointers = ExceptionInfo;
    loExceptionInfo.ThreadId = GetCurrentThreadId();
    loExceptionInfo.ClientPointers = TRUE;

BOOL bRes = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
 
    CloseHandle(lhDumpFile);

ExceptionInfo 是程序的异常信息,UnhandledExceptionFilter() 函数的唯一参数类型,所以可以在 UnhandledExceptionFilter() 函数内生成Dump文件。

记得最后CloseHandle  文件句柄。

 

 

posted on 2013-01-06 14:25  布丁嫩  阅读(1313)  评论(0编辑  收藏  举报