异常处理——一些注意事项(4)

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.在处理父进程到子进程之间,可以通过参数传递,也可以通过文本传递信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值