1.Dump文件的分析
Vs2012直接打开判断是否成功、windbg打开输入语句!Analyze –v分析
2.注意事项:
2.1 处理句柄问题时,同一pid获取不同的句柄值-注意
因为没有close
2.2
//这段代码很有价值
#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;
}
//代码分析!!!!!!
1.SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
设定异常函数,如果有异常,系统会先用我们的函数处理异常
2.struct _EXCEPTION_POINTERS* ExceptionInfo
错误信息在这个结构体里面
3. MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
错误信息转存到这个结构体,为了写入
这里要设置好,子进程创建迷你dump文件时loExceptionInfo.ClientPointers = FALSE;
4.MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
第一个和第二个参数要都是父进程的!
5.在处理父进程到子进程之间,可以通过参数传递,也可以通过文本传递信息