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

关于 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,其他童鞋是不是也有这种情况?

 

 

《近匠》SENSORO CTO赵东炜:解密iBeacon生态 我由Angular转向React,为什么? 产品设计中的九个注意事项 昂贵、复杂、不可靠!智能家居产品的尴尬现状 Facebook的CIO都做些什么? 穷游网CTO黄向阳:成果与价值是最好的驱动力 2015移动游戏行业方向标:创业者必须关注的几个领域 基于Python的行为驱动开发实战 面向WP和Android!微软车库发布多款免费应用 GRPC:谷歌发布的首款基于HTTP/2和protobuf的RPC框架 革命,就是现在!——CES 2015行纪 HTML5游戏引擎排行榜 Construct 2最受欢迎 2015手游营销新趋势:电视广告,及其投放逻辑 详解下一代开源混合应用框架Reapp 应用内一键交易!Google公布Android Pay项目 Timehop为什么要放弃Rails,转向Go? 无线充电技术走入客厅 宜家推出“Home Smart”系列 发布仅一年,虚幻引擎4宣布完全免费! HTML5初学者福利!11个在线学习网站推荐 Qualcomm发布Snapdragon 820与超声波指纹识别技术 App Store应用僵尸化:没品质没资本的必然走向 Unity 5正式发布:支持21种平台、个人版免费! 创新高性能移动UI框架——Canvas UI 框架 取精华、去糟粕!适合iOS开发者的15大网站推荐 Swift如何优化性能? 【程序员电子刊精选】明道CEO任向晖:企业也需要养成好习惯 你信吗?重构软件并不会改善代码质量 融合VR与AR:uSens推出虚拟现实手机头盔 4月17-18日,OpenStack、Spark、Container齐聚OpenCloud 2015 第四代CSS选择器,那些让你激动的新特性 联通WO+开放平台“App计费 ” 保障手机应用付费安全 GOOGLE被中国"冷处理" 请介绍一本好一点的Winsock函数编程的书,电子书或者纸书都可以 关于全局CDatabase; mysqldump备份数据库时总是出错? 谁有http://211.100.6.72的源代码最好有附带的数据库连接说明。200 在2000server上安装oracle的问题,求教! 怎样深层理解delphi的类变量 数据库中日期范围怎么比较? 如何将Access的数据导入SQL-server 散分了,高手请进---.net不能够bug ???怎样在Delphi中对导出到Excel文件单元格进行划线???? 在VB中如何进行程序的数据输入有效性验证? 请上次回答我NT问题的同志进来拿分,上次只给了100 如何学winzip那样,在弹出菜单中增加一个新的项目 英国有好点的软件公司吗? 高分求救水晶报表问题? 从数据库中取最新的第10~第20条纪录的sql语句如何写啊?各位大侠帮忙啊 记录集问题 sco unix下可以运行tcpdump吗? 无法启动X,出现cound not init font path element unix:7100,removing from list...could not open default font 'fixed' 请问是否可以在VC++下编写一个声音程序,如何编写?(只要能发出一个或两个音符就可以了) 程序员今年还可以报吗? 在flash里面,用什麼命令,可以把gif變成矢量圖?? 怎么用TC编写一个显示320*240的16色位图的程序? 用什么函数可以得到msflexgrid的行号(row的值)? 请朋友们帮忙推荐几本PB8的关于B/S和三层结构编程的书 网上邻居的问题! 在ASP.NET中,控件好像不能被设置成控件数组,请高手回答 Word文章被锁定了! 非常奇怪的数据连接问题 乐晕了,散分! 数据库问题 韩国公司展示防性侵袭的贞操内裤(图文) asp+oracle中关于字符串相加的问题。 各位大哥,我对sybase很陌生,有几个简单的问题想请教,很急,在线等待!!! 有msdn的请进! 杭州程序员一个月多少钱啊 网上邻居求救啊 有没有DOM方面的资料呀 VC的Maximize Speed优化到底优化了什么? 动态建表 向各位高人求救 页面转移的问题,轻松拿分 问一个困扰我很长很长时间的问题(关于类库的)!! 名词解释!!!! vb程序打包,第一次!!!问题啊!!!?????(第二次提问!!!!) java的WEB应用中是否能够调用其他本地的客户端 ? meizz(梅花雨) 再教教小弟,谢谢 服务器对象 错误 'ASP 0178 : 80070005' 问问版主--21bird 什么控件可以画流程图?(Tchart可以吗?怎么用?) 高中政治如何理解唯物辩证法的辩证否定观?它要求我们应该怎样做如何理解唯物辩证法的辩证否定观?它要求我们应该怎样做 化学平衡题中的恒容和恒压的区别,在平衡时两者导致什么不变?变量又是什么? 漏电开关和空气开关什么牌子好假货少 可持续发展观的主要要求(政治题)可持续发展观的主要要求是什么?(政治题)不确定的请不要回答,要求权威回答,谢谢.这是一道政治题,请按照政治题的答题格式答题,按照政治课本的要求 电烙铁可以焊比较精密的电路吗!我mp4 usb 接口脱焊想DIY 不知一把电烙铁能否搞定,我怕搞短路!我坚决不找维修人员.DIY 一向是我的态度:: 漏电开关空气开关什么牌子好 世界上最大的洲是亚洲最小的洲是大洋洲亚洲的面积比大洋洲面积的4倍还多812万平方千米大洋州的面积是多少 没有烙铁怎么焊接 请问家庭总开关应该要用空气开关好还是漏电开关好呢?还是空气带漏电好? 亚洲的面积比大洋洲面积的4倍还多812万平方米千米问大洋洲的面积是多少万平方千米 人体产生的代谢废物为什么必须及时排出体外急急急急急急急急急急急急急急急急急急急急急急 上面是音下面是克这是什么字 亚洲的面积比大洋洲面积的四倍还多812万平方千米求大洋洲(简单方程) 八大行星内有水分的星球 满字还有什么音 世界上最大洲是亚洲亚洲是面积比大洋洲面积的4倍还多812万平方千米,大洋洲的面 水在加热过程中有什么特点(要三个) 自然界的动物都是精子主动进入卵子的吗?有没有卵子主动把精子吸进去的? 世界上最大的洲是亚洲,亚洲的面积比大洋洲的面积的4倍还多812万平方千米,大洋洲的面积是多少万平方千米要算数方法 方程我会 学完方程把算术方法忘了 水的加热过程有哪些特点,至少三个 自然界所有动物都是精字主动进入卵子 而没有卵子主动进入精子的?我知道精子小 卵子进不去 我是想问问卵子遇到精子后 会不会主动把精子吸进去 为什么真空高汽机做功能力强 写出下列分子或离子的空间构型:HCNHCN,SO2,SO3,BF3,CO32-,BECL2,NCL3 墙壁开关插座怎么拆开来?如下图中的五孔插座怎么拆开来? 问一个字~上下结构的,上面有两个“目”下面一个“空”,大家有谁知道叫什么吗~同上~字典真的没有查到目目空 一根圆形钢管的外直径为20厘米,在钢管上绕了500圈铜丝,求铜丝长为多少? 自然界有没有卵子主动把精子吸进去的动物? 请问你有制作恒温烙铁的电路图吗?24伏的 人类移民最有可能去哪个星球除了太阳系内的星球, 自然界所有的动物都是卵子体积比精子大吗 为什么最近频频发地震?是不是世界末日要到来了? 两个灯的开关,想改成一开五孔,开关插座互相不影响,一共有三根线,怎么接?另一个灯不打算用了 漏电开关什么牌子好? 八大行星中,离地球最近的行星是什么? 人类在以后真的能移民外星球吗? 家用漏电保护器和断路器哪个更好 八大行星中离地球轨道最近的两颗行星是( )和( ). 八大行星哪个最合适太空移民 在英语中,开口音 闭口音是 ``` 八大行星中体积最大的是什么星球 八大行星中哪一个最适合移民?请问你认为那一个最适合移民?原因. 家装用63A的漏电开关和63a空开合理吗 化学平衡的移动如何理解 氢氧化钠的结构式怎么写 一个汉字读音根据韵母怎样辨别它是开口音还是闭口音?一般开口和闭口音的韵母分别是哪些?a o e i u中a o e 是开口音u i是闭口音,那复合的如 ai ei ui ao an en eng ang 等等该怎样辨别?那么ai ei ui也 怎么理解化学平衡移动? 求Naclo Naoh H2O2 K2O2 的结构式 意大利语中O什么时候发开口音,什么时候发闭口音?沈萼梅编的意大利语入门里面讲得好复杂,貌似和词缀有关系.那不属于这些情况的是不是可以随便发了?比如tuo,suo,suoi.还有buongiorno里面三个o 人体大量饮入生理盐水,尿量怎样变化,为什么会这样?机制是什么? 汽轮机除了用水蒸汽外还可以用其他低沸点液体吗? C6H8O4与NaOH的反应方程式,前者结构式见问题图.生成物和NaOH的反应式, 快速注射生理盐水后尿量的变化 图中那个电路图我要用电路板和电烙铁把它焊出来,第一次做,请问那几个地该接哪里啊?这个我只要用几根导线把芯片和电阻电容电感连接起来就行了吧?求指导, 水还有什么好处 大量饮用清水,大量静脉注射生理盐水,大量静滴甘露醇,尿量分别有何变化,为什么? 如图所示的四个电路中,R为电烙铁,为了使电烙铁在不焊接时烙铁头不致过热,但又 一种是椭圆的细胞甲,另一种是外面有大致为六边形的那种为乙,哪一种是动物细胞,哪一种是植物细胞?理由是?————————————————————————————. 太阳系八大行星中,体积最大的行星是 关与化学平衡的恒压与恒容的区别,细致,需要非常细致的讲解,麻烦了.谢谢. 高尔基体在动植物细胞有何不同?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘