1.本进程实现异常函数
1.1 实例
翻阅了好久的文献资料,终于让我找到这篇巨好的文章。
http://blog.csdn.net/vagrxie/article/details/4398721 异常处理与MiniDump详解(4) MiniDump
通过里面的例子,就可以实现一个简单的例子。以下我又整理了三段代码,详细介绍设置顶层异常函数。
//代码一
#include <string>
#include <iostream>
using namespace std;
class MyException : public exception
{
public:
MyException(const char* astrDesc)
{
mstrDesc = astrDesc;
}
string mstrDesc;
};
int _main(int argc, _TCHAR* argv[])
{
try
{
throw MyException("A My Exception");
}
catch(MyException e)
{
cout <<e.mstrDesc <<endl;
}
return 0;
}
//代码二(此篇文章主要看这个代码)
#include <windows.h>
#include <Dbghelp.h>
#include <iostream>
#include <tchar.h> //_T("")是一个宏,定义于tchar.h下
using namespace std;
#pragma auto_inline (off) // 取消掉自动内联效果,这样才能达到更好的演示效果
// 不然,Fun,Fun2这种简单的函数会被自动内联,那么也就没有堆栈,不好看到实际中Dump的作用
#pragma comment( lib, "DbgHelp" ) // 导入DbgHelp库,以使用MiniDumpWriteMiniDump API
// 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
void Fun2()
{
int *p = NULL;
*p = 0;
}
void Fun()
{
Fun2();
}
int main()
{
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
Fun();
std::cout << "aaaaaaa" << std::endl;
return 1;
}
//代码三:(增加了seh)
#include <windows.h>
#include <Dbghelp.h>
#include <iostream>
#include <tchar.h> //_T("")是一个宏,定义于tchar.h下
using namespace std;
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
// 为了程序的简洁和集中关注关心的东西,按示例程序的惯例忽略错误检查,实际使用时请注意
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS* ExceptionInfo
)
{
HANDLE lhDumpFile = CreateFile(_T("DumpFile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
void Fun2()
{
__try
{
static bool b = false;
if(!b)
{
b = true;
int *p = NULL;
*p = 0;
}
else
{
MessageBox(NULL, _T("Here"), _T(""), MB_OK);
}
}
__except(MyUnhandledExceptionFilter(GetExceptionInformation()))
{
}
}
void Fun()
{
Fun2();
}
int main()
{
Fun();
Fun();
return 1;
}
1.2 函数分析
//MiniDumpWriteDump函数
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
//1、2是用来指定转储文件所描述的进程,3.转储文件的句柄,4.指定写入信息的类型和选项(书上有)
//5.无 6.指定希望写入到转储文件中的用户数据 7.指定一个回调函数,了解和进一步定制产生转储文件的过程
//MiniDumpWriteDump函数
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
//代码
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
TCHAR szCmdLine[480];
int i;
if(argc == 1)
{
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESIZE;
si.dwXSize = 160;
si.dwYSize = 80;
for(i = 0; i < 2; i++)
{
_stprintf_s(szCmdLine, _T("\"%s\" %c"),
argv[0], _T('B') + i);
if(CreateProcess(NULL, szCmdLine,
NULL, NULL, TRUE,
NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi))
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
}
putchar(_T('A'));
getchar();
}
else
{
_tprintf(_T("%s"), argv[1]);
getchar();
}
return 0;
}
2.参考资料
以下的参考资料是集齐了minidump、异常处理机制等技术的超级好用的资料:
参考资料
http://www.cnblogs.com/lisuyun/p/5245609.html window下使用SetUnhandledExceptionFilter捕获让程序的崩溃
http://www.debuginfo.com/examples/effmdmpexamples.html minidump英文
http://blog.csdn.net/krqii/article/details/81420 错误处理和异常处理,你用哪一个
http://blog.csdn.net/vagrxie/article/details/4317423?locationNum=2&fps=1 异常处理与MiniDump详解(1) C++异常
http://blog.csdn.net/vagrxie/article/details/4323962 异常处理与MiniDump详解(2) 智能指针与C++异常
http://blog.csdn.net/vagrxie/article/details/4382591?locationNum=1&fps=1 异常处理与MiniDump详解(3) SEH(Structured Exception Handling)
http://blog.csdn.net/vagrxie/article/details/4398721 异常处理与MiniDump详解(4) MiniDump