您的位置:首页 > 其它

利用SetUnhandledExceptionFilter获取程序异常时的DUMP文件

2013-07-03 10:51 417 查看
利用SetUnhandledExceptionFilter实现程序异常时获取DUMP文件来分析程序异常原因,现在很多的软件都是通过这样的方法来收集异常,只不过这里少了一步向服务器传输我们的程序产生的DUMP文件,这种DUMP文件产生后其实会通过网络向指定的服务器传输。这样方便开发都收集程序目前存在的BUG。

下面是一控制台程序,直接COPY代码,编译运行,我这里用了两种方法使程序异常崩溃,从而产生DUMP文件,对于产生的DUMP文件我们可以使用WinDBG来进行分析。

#include <Windows.h>

#include <dbghelp.h>

#pragma comment(lib, "dbghelp.lib")

LONG MyUnhandledExceptionFilter(_EXCEPTION_POINTERS *ExceptionInfo)

{

CHAR strDumpFile[MAX_PATH] = { 0 };

SYSTEMTIME tm;

HANDLE hFile = NULL;

GetSystemTime(&tm);

sprintf(strDumpFile, "%04d%02d%02d%02d%02d%02d.dmp", tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond);

hFile = CreateFileA(strDumpFile,

GENERIC_WRITE,

FILE_SHARE_WRITE,

NULL,

CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL);

if(hFile != INVALID_HANDLE_VALUE)

{

MINIDUMP_EXCEPTION_INFORMATION ExInfo;

ExInfo.ThreadId = GetCurrentThreadId();

ExInfo.ExceptionPointers = ExceptionInfo;

ExInfo.ClientPointers = NULL;

BOOL bOK = MiniDumpWriteDump(

GetCurrentProcess(),

GetCurrentProcessId(),

hFile,

MiniDumpNormal,

&ExInfo,

NULL,

NULL);

CloseHandle(hFile);

}

return EXCEPTION_CONTINUE_SEARCH;

}

int _tmain(int argc, _TCHAR* argv[])

{

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)MyUnhandledExceptionFilter);

// 第一种产生异常的方法

//char *str = NULL;

//memcpy(str, "Hello", 5);

// 第二种产生异常的方法

int i = 10;

while(1)

{

printf("%d\n", 10/i);

i--;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: