错误报告

在程序代码的任何开始的地方调用
SetUnhandledExceptionFilter(CleanToolExceptionFun);


void GetCurModulePath(TCHAR* ptcPath,int iLen,LPVOID addr)
{
    MEMORY_BASIC_INFORMATION mbi = {0};
    if(FALSE == ::VirtualQuery( addr, &mbi, sizeof(mbi)))
        return;
    UINT_PTR h_module = (UINT_PTR)mbi.AllocationBase;
    ::GetModuleFileName((HMODULE)h_module, ptcPath, iLen);
    return;
}


void EI2Str(TCHAR* ptcInfo,int iInfoLen,ULONG_PTR* Info,int iCount)
{
    int        i    = 0;
    TCHAR*    p1    = ptcInfo;
    for(i = 0; i < iCount; i++)
    {
        _stprintf(p1,_T("X "),Info[i]);
        p1 += 9;
    }
}




LONG WINAPI CleanToolExceptionFun(struct _EXCEPTION_POINTERS* pei)
{
    STACKFRAME    sf;
    CONTEXT        context;
    TCHAR        tcPath[2048]    = {0};
    TCHAR        tcInfo[10240]    = {0};
    TCHAR        tcExcep[20480]    = {0};
    GetCurModulePath(tcPath,2048,pei->ExceptionRecord->ExceptionAddress);
    EI2Str(tcInfo,10240,pei->ExceptionRecord->ExceptionInformation,pei->ExceptionRecord->NumberParameters);
    _stprintf(tcExcep,_T("³ÌÐòÓöµ½Î´ÖªÒì³££¬¾ßÌåÐÅÏ¢ÈçÏ£º ´úÂ룺0xX  ±êÖ¾£º0xX  µØÖ·£º0xX ")
        _T("²ÎÊý£º%d  %s Ä£¿é£º%s ¶ÑÕ»ÐÅÏ¢ÈçÏ£º "),
        pei->ExceptionRecord->ExceptionCode,pei->ExceptionRecord->ExceptionFlags,pei->ExceptionRecord->ExceptionAddress,
        pei->ExceptionRecord->NumberParameters,tcInfo,tcPath);


    memset(tcInfo,0,sizeof(tcInfo));
    memset( &sf, 0, sizeof(STACKFRAME));
    memcpy(&context,pei->ContextRecord,sizeof(CONTEXT));


    sf.AddrPC.Offset    = context.Eip;
    sf.AddrPC.Mode        = AddrModeFlat;
    sf.AddrStack.Offset    = context.Esp;
    sf.AddrStack.Mode    = AddrModeFlat;
    sf.AddrFrame.Offset    = context.Ebp;
    sf.AddrFrame.Mode    = AddrModeFlat;


    DWORD machineType    = IMAGE_FILE_MACHINE_I386;
    HANDLE hProcess        = GetCurrentProcess();
    HANDLE hThread        = GetCurrentThread();
    SymInitialize(hProcess,NULL,TRUE);


    for( ; ; )
    {
        if( !StackWalk(machineType, hProcess, hThread, &sf, &context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 ) )
        {
            break;
        }


        if( sf.AddrFrame.Offset == 0 )
        {
            break;
        }
        BYTE symbolBuffer[ sizeof( SYMBOL_INFO ) + 1024 ];
        PSYMBOL_INFO pSymbol = ( PSYMBOL_INFO ) symbolBuffer;


        pSymbol->SizeOfStruct = sizeof( symbolBuffer );
        pSymbol->MaxNameLen = 1024;
        
        _stprintf(tcPath,_T("sf.AddrPC.Offset£º0xX "),sf.AddrPC.Offset);
        _tcscat(tcExcep,tcPath);
        
        memset(tcPath,0,sizeof(tcPath));
        DWORD64 symDisplacement = 0;
        if( SymFromAddr( hProcess, sf.AddrPC.Offset, 0, pSymbol ) )
        {
            _stprintf(tcPath,_T("Function : %s "), pSymbol->Name );
        }
        else
        {
            
        }
        
        _tcscat(tcExcep,tcPath);


        IMAGEHLP_LINE lineInfo = { sizeof(IMAGEHLP_LINE) };
        DWORD dwLineDisplacement;


        memset(tcPath,0,sizeof(tcPath));
        if( SymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo ) )
        {
            _stprintf(tcPath,_T( "[Source File : %S] [Source Line : %u] "), lineInfo.FileName,lineInfo.LineNumber ); 
        }
        else
        {
        }
        _tcscat(tcExcep,tcPath);
    }


    SymCleanup(hProcess);


    //AfxMessageBox(tcExcep);
    CDlgExceptionInfo dlg(tcExcep);
    dlg.DoModal();
    return EXCEPTION_EXECUTE_HANDLER;//EXCEPTION_CONTINUE_SEARCH;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值