说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

关于 VS2010 异常捕获

HTML文档下载 WORD文档下载 PDF文档下载
好长时间没来了,都变了,幸亏帐号还在,密码也好记得。祝 vckbase/okbase 越来越好吧。记录一下:程序异常崩溃前的信息。

//=========================================================================.h#include "DbgHelp.h"  //调试信息#pragma comment( lib,"DbgHelp.lib" )private: //异常结构体,定义在 WINNT.h 里 _EXCEPTION_POINTERS * m_epi; //获得异常结构体的解释文本 CString GetException(_EXCEPTION_POINTERS *epi); //获得一个模块地址的全路径 CString GetExceptionPath(LPVOID addr); //获得异常信息的参数解释文本 CString GetExceptionParam(ULONG_PTR* Info,int iCount); //=========================================================================.cpp// ---------------------------------------------------------------// 名称: GetException// 功能: 根据异常结构体,解释出能够识别的文本信息,含中、英文双语信息// 变量: [in] pei -- 异常信息的结构体// 返回: 解释后的文本// 编写: // ---------------------------------------------------------------CString CLogs::GetException(_EXCEPTION_POINTERS *pei){ if( NULL==pei )	return _T(""); STACKFRAME    sf; CONTEXT       ct; CString sPath,sInfo,sTemp,sErr_CN,sErr_EN; sPath = GetExceptionPath( pei->ExceptionRecord->ExceptionAddress ); sInfo = GetExceptionParam( pei->ExceptionRecord->ExceptionInformation,pei->ExceptionRecord->NumberParameters );  //------------------------------------------------- //程序运行到这里,可能已经没有机会获取多国语言资源了 //所以直接硬编码,采用中、英文双语提示,其他对话框请勿使用这种方式 CString sep = _T("------------------------------------------------------------------\r\n"); sErr_CN = sep; sErr_EN = sep; sTemp.Format( _T("很抱歉,遇到了未知异常,程序需要暂时关闭。\r\n代码: 0x%08X, 标志: 0x%08X, 地址: 0x%08X\r\n")      _T("参数: %d  %s,模块:%s\r\n"),     pei->ExceptionRecord->ExceptionCode,pei->ExceptionRecord->ExceptionFlags,pei->ExceptionRecord->ExceptionAddress,     pei->ExceptionRecord->NumberParameters,sInfo,sPath ); sErr_CN += sTemp; sTemp.Format( _T("Sorry, Dump An unkonw error, need to close program.\r\nCode: 0x%08X, Flag: 0x%08X, Address: 0x%08X\r\n")      _T("Param: %d  %s,Module:%s\r\n"),     pei->ExceptionRecord->ExceptionCode,pei->ExceptionRecord->ExceptionFlags,pei->ExceptionRecord->ExceptionAddress,     pei->ExceptionRecord->NumberParameters,sInfo,sPath ); sErr_EN += sTemp; //------------------------------------------------- 	memset( &sf,0,sizeof(STACKFRAME) );    memcpy( &ct,pei->ContextRecord,sizeof(CONTEXT) );	sf.AddrPC.Offset    = ct.Eip;    sf.AddrPC.Mode      = AddrModeFlat;    sf.AddrStack.Offset = ct.Esp;    sf.AddrStack.Mode   = AddrModeFlat;    sf.AddrFrame.Offset = ct.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, &ct,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;          //-------------------------------------------------    sTemp.Format( _T("偏移地址:0x%08X\r\n"),sf.AddrPC.Offset);  sErr_CN += sTemp;  sTemp.Format( _T("Offset:0x%08X\r\n"),sf.AddrPC.Offset);  sErr_EN += sTemp;  //-------------------------------------------------        if( SymFromAddr(hProcess,sf.AddrPC.Offset,0,pSymbol) ) {   #if _UNICODE    //-------------------------------------------------    LPCWSTR wstr = AnsiToUnicode( pSymbol->Name );    sTemp.Format( _T("函数: %s\r\n"),wstr );       sErr_CN += sTemp;    sTemp.Format( _T("Function: %s\r\n"),wstr );      sErr_EN += sTemp;        delete [] wstr;    //-------------------------------------------------   #else	sTemp.Format( _T("函数: %s\r\n"),pSymbol->Name );       sErr_CN += sTemp;    sTemp.Format( _T("Function: %s\r\n"),pSymbol->Name );      sErr_EN += sTemp;#endif}           	IMAGEHLP_LINE lineInfo = { sizeof(IMAGEHLP_LINE) };	DWORD dwLineDisplacement;	if( SymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo ) ) {   	#if _UNICODE    //-------------------------------------------------    LPCWSTR wstr = AnsiToUnicode( lineInfo.FileName );	sTemp.Format( _T("源文件: %s, 错误行: %u\r\n"), wstr,lineInfo.LineNumber );    sErr_CN += sTemp;    sTemp.Format( _T("File: %s, Line: %u\r\n"), wstr,lineInfo.LineNumber );    sErr_EN += sTemp;    delete [] wstr;    //-------------------------------------------------   #else    	sTemp.Format( _T("源文件: %s, 错误行: %u\r\n"), lineInfo.FileName,lineInfo.LineNumber );    sErr_CN += sTemp;    sTemp.Format( _T("File: %s, Line: %u\r\n"), lineInfo.FileName,lineInfo.LineNumber );    sErr_EN += sTemp;#endif           }       }       SymCleanup( hProcess );   //-------------------------------------------------  sErr_CN += sep; sErr_EN += sep; //------------------------------------------------- return (sErr_CN + sErr_EN);}// ---------------------------------------------------------------// 名称: GetExceptionPath// 功能: 根据异常地址,解释并获得对应的模块全路径// 变量: [in] addr -- 异常信息的结构体// 返回: 异常地址对应的模块全路径// 编写: // ---------------------------------------------------------------CString CLogs::GetExceptionPath(LPVOID addr){ CString sRet = _T(""); MEMORY_BASIC_INFORMATION mbi = {0}; if( FALSE==::VirtualQuery(addr,&mbi,sizeof(mbi)) ) return sRet; UINT_PTR hMod = (UINT_PTR)mbi.AllocationBase; TCHAR szFilePath[MAX_PATH+1]; GetModuleFileName( (HMODULE)hMod,szFilePath,MAX_PATH ); sRet = szFilePath; return sRet;}// ---------------------------------------------------------------// 名称: GetExceptionParam// 功能: 将异常参数信息解释为可识别的文本// 变量: [in] Info -- 异常信息参数//   [in] iCount -- 参数的个数// 返回: 解释后的文本// 编写: // ---------------------------------------------------------------CString CLogs::GetExceptionParam(ULONG_PTR* Info,int iCount){	int i = 0;	CString ss, sRet = _T("");	for( i=0;i<iCount;i++ ) {    ss.Format( _T("%08X "),Info[i] );      sRet += ss;   } return sRet;} //=========================================================================调用// ---------------------------------------------------------------// 名称: XDumpException// 功能: 发生异常时,写入 log/dump 文件,并弹出异常信息对话框// 变量: [in] epi -- 异常信息的结构体// 返回: 1,系统异常// 编写: // ---------------------------------------------------------------LONG WINAPI XDumpException(struct _EXCEPTION_POINTERS* epi){   DWORD dwCode = epi->ExceptionRecord->ExceptionCode;  if( dwCode==EXCEPTION_ACCESS_VIOLATION ) {    //转到这里去处理    CLogs log;  log.Dump( epi ); } return EXCEPTION_EXECUTE_HANDLER;}// CGMMainApp 初始化BOOL CGMMainApp::InitInstance(){ //---------------------------------------------------------- //异常信息输出,独立运行时有效,VSS 调试环境下无效  SetUnhandledExceptionFilter( XDumpException );
顺便说一下,这个编辑器不好用哦,光标不随鼠标点击走,用上下键,很费劲的。我是WIN7+IE10,其他童鞋是不是也有这种情况?

 

 

API设计如龙生九子,Tunneling、Hypermedia等更受开发者青睐 NFV+SDN,博科打造开放式网络平台 亚马逊开放双SDK:摄像购物,追踪脸部玩游戏 解析淘宝Hadoop作业平台——宙斯Zeus 亚马逊的心思:要Android不要谷歌 Vuforia SDK全面更新:3.0版可实时生成虚拟场景和物体 Stream SDK:以手为“剪”,随时随地分享精彩内容 一周消息树:惠普研发基于Linux开源操作系统 打造全新计算机 我从谷歌学到的那些事:Toilet文化、代码实验室 对话大神Scott Shenker:从物理博士到SDN&amp;#039;s Uncle 巨头们的又一战:健康数据服务平台 移动应用广告新竞争,Facebook不再一家独大 为什么Fire Phone手机价格不便宜? 老牌播放器暴风影音发力线下与自制内容 APP运营:“小数据”为合理化推送定位 TCL H5TV:回归电视本质,与开发者共赢 烽火星空徐国龙:依托平台,坚持开放与标准,企业移动化快速研发之道 首届bong线上黑客马拉松第一阶段达成! 12支团队晋级 APSys 2014,AMD将发表基于异构体系的DNN实现与评估 PagerDuty实战分析:将MySQL迁移至XtraDB并成功运行EC2 Molecule:自食其力的免费HTML5游戏框架 智能家居升级:Nest启动开发者计划,并开放API Docker,从这里做起! 《近匠》云巴创始人张虎:低门槛云服务为小团队创造更多机会 Oculus公司同意收购Xbox 360手柄设计团队 公有云VS私有云 哪个数据更安全? 调查:开发者越老越吃香吗? Facebook在线支付:取代虚拟货币的终极边界 Google I/O前析:关于新一代设计框架Quantum Paper的猜想 Google I/O 2014前瞻:“令人发指”的Android产品线 福昕熊雨前:PDFium开源项目的背后 ERROR:ORA-12560: TNS: 协议适配器错误 如何在SQL语句里精确小数点以后的位数不清 想得到一段程序的运行时间,C#中提供的time精确度太低,有没有精度比较高的算法? 在客户端已知某个文件的存放路径而不通过HTML的FILE控件再进行浏览选择,怎样把这个文件上传到服务器上 在VBA中变量的值改变后如何保存住值啊? 请问ListView怎么实现(点击标题栏字段名时)排序?谢谢 为什么生命还是这么短 关于电子论坛的设计!!!(回答有意义的高分美人相送,灌水的大炮伺候) jdk1.4大量认证资料奉送 请教对话框的创建 几个小问题,请大家多多帮忙!在线等待 请大家仔细看看,不知道我有没有写清楚,不知道算不算难还算容易....... win2000 sever怎样安装borland c++builder?(高分100) 请大家帮个忙,举手之劳而已 使用MSComm,在关闭窗口的时候,出现“端口已打开”的错误。怎么解决? 请问这几段C#语句怎么办? applet问题,期待高手出现 如何使用OpenDialog啊? 高分组网,斑竹不要删~~~~~~~~~~~~~~~ win2000 sever怎样安装borland c++builder?(高分100) 如何按分组条件,给一个字段乘以不同的值 求电子书!!! win2000问题,很急.在线等 求教,用delphi编的drm程序,急!~~~~~~~~ 请教对话框的创建 倒粪1 win2k中tts问题 XML+XSL+HTML运行出错(书上的例子) 倒粪2 高手帮我看一下这个奇怪的问题 倒粪3 ServerSocket的疑问 倒粪4 电脑配件 请问如何在JBuilder中调用我自己编写的JavaBean? 文件1可以Imports文件2的Namespace么? 我需要一个汉字的字库和词库,请问在什么地方能够得到?或者怎么可以从一个输入法程序中导出词库或词库?多谢。 调查:有多少人用的支持Java的手机? 关于注册表重命名操作? redhat的lilo问题 急!!!!!!计算机启动后,能检测到新的硬件并安装驱动,之后出现错误按任一键继续按三键重启任一键后,屏幕上一无所有,出现蓝屏,多次启动依然 常用工具栏不见了?怎么加上啊? 哪里有windows2000的资源工具包下载? win2000启动问题!!! 请问如何取得客户端(浏览网页的用户)的ip地址????????????? 学过数据结构的不妨来看一看! 好心人,进来看看!小弟我也快沉了,帮帮忙,谢谢了! 如何实现计算器的屏幕从右端开始显示? 交叉表FILTER 关注Tcl/Tk语言的朋友请进 df 语文黄冈小状元二年下册级答案 英译英怎么说 这个用英文怎么说 的英译是? 在二十年以后 英译怎么说 仿生学------蜘蛛和装甲 水蜘蛛的仿生学例子开头怎么写 蜘蛛的习性和体貌特征 回答深奥一点 1+1=?深奥一点 画画要以党的光辉历程这个题目,该怎么画,画什么? 五年级的学生可以画什么题材的图画? 日养老金机构局长携公款藏匿泰国 遭情大众成德国薪酬差距最大公司 高管薪酬英国艺术家用83幅自画像拼成《蒙娜丽一驻日美军士兵酒后驾车与出租车相撞被日本官房副长官:将继续摸索日韩首脑会日警视厅拟加强对骑自行车肇事者处罚力印度民众燃放爆竹庆祝排灯节 引发环境俄罗斯惊现一专杀老年女性杀人狂 两年德国1500幅被纳粹搜刮名画被估值高奥巴马被指政治光环不再 支持率与声望泰国看好高端中国游客 旅游业增聘通晓鹤翔高原国务院侨办主任裘援平新春访香港华侨华茶心如雪(半日闲谭)将开建津石高速公路华为助力法国打造“平安城市”美上诉法院维持暂停执行入境限制令推动“一带一路”建设取得更大进展严禁向医务人员下达创收指标冬之忆不忘苦难 追求正义2万所全国校园足球特色学校建设任务拟
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘