SetUnhandledExceptionFilter 相关收集异常信息
来源:互联网 发布:excel中的数据有效性 编辑:程序博客网 时间:2024/06/05 03:50
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("%08X "),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("程序遇到未知异常,具体信息如下: 代码:0x%08X 标志:0x%08X 地址:0x%08X ")
_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:0x%08X "),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_HA
然后在程序代码的任何开始的地方调用
SetUnhandledExceptionFilter(CleanToolExceptionFun);
- SetUnhandledExceptionFilter 相关收集异常信息
- 收集程序异常信息
- 虚拟机相关信息收集
- Android程序异常信息收集
- SetUnhandledExceptionFilter处理未捕获异常
- SetUnhandledExceptionFilter处理未捕获异常
- SetUnhandledExceptionFilter,设置异常处理函数
- Java异常收集 - 反射相关
- delphi 框架相关信息收集
- Material Design相关信息收集
- 异常处理和软件异常 -- SetUnhandledExceptionFilter
- SetUnhandledExceptionFilter
- SetUnhandledExceptionFilter
- SetUnhandledExceptionFilter
- SetUnhandledExceptionFilter
- SetUnhandledExceptionFilter
- android开发异常信息收集程序代码
- SetUnhandledExceptionFilter无法捕获异常原因及解决方法
- 14、如何在Eclipse中查看Android源码或者第三方组件包源码
- winamial4.5 破解的新尝试,新改进
- 判断员工属于哪个国家组
- 内核模块编程 Hello Kernel
- 找不到可安装的ISAM,Access 连接字符串
- SetUnhandledExceptionFilter 相关收集异常信息
- 人人API
- 新增一个模型(Model)(ASP.NET MVC3系列文章四)
- OpenGL光源光照使用范例
- Struts2-Json-Plugin 的使用(翻译自官方文档)
- Android_设置环境变量改变AVD存储位置
- 解决Myelcipse 启动服务时内存溢出问题。
- 根据molga获得country code
- linux ln 链接指令