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

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

 

 

Android开发需要自己完善的类库总结 Android的ListView控件滚动时背景问题 GestureDetector手势识别类 - 进阶篇 MenuInflater Android菜单从xml创建方法 EditText输入提示你知道吗? Android布局Java代码构造法 Android全屏设置代码 测试Android软件性能主要方法 自定义Android标题栏TitleBar布局 获取Android屏幕方向及键盘状态 Android平台XML解析库功能不完整 GestureDetector手势识别类 - 入门篇 不会Java或C,Android123告诉你还有选择 Splash Screen开场屏在Android中的实现 Android游戏开发性能改进要点 Android的Activity你知多少呢? JSONObject在Android上的应用 Android高性能文件类MemoryFile 判断Android文件名是否安全技巧 让你的Android程序兼容多种分辨率 Android Button按钮控件美化方法 Android堆内存也可自己定义大小 TextUtils类-Android字符串处理类 InputSream输入流转String字符串,Android开发工具类 Android中的正则表达式Regex使用 优化Dalvik虚拟机的堆内存分配 Android标题栏进度指示器使用方法 Thread和Looper以及Handler和Message详解 Android开发必读 layout资源包含,android开发必读 Android本地化开发技巧 Android开发网将推出每天一类专题 从新做人 求救:在NT Server下调用GetVolumeInformationA取分区序列号,返回结果为负数!!!怎么回事啊? 正式到新公司上班,送300分,感谢在我最困难的时候在“软件工程”版给过我帮助的朋友们!! 请问斑竹及所有人,怎样得到QuickReport的总页数? Websphere3.5的一个BUG.希望有人反对.多谢.. 什么是DAMAP的对象 哪里有 winpcap 或 libnet 及其他网络编程辅助包下载? 谁能提供PSP文档?最好是Humphrey的那本书! 代码出现bebug.请大家帮我找!!!! TO:net_lover(孟子E章),详情请入内! 有谁用过DEV express系列的dxdbgrid??它是如何把一个文本文件txt读到dxdbgrid1.columns[i]的picklist中去,作为picklist的内容的啊? 我想在Linux下做数据库开发,用什么数据好? 我的pws可能出了问题,那位高手能解决一下 关于控制winamp 各位同行你们有这个的源程序吗(Cacio DT-900数据采集器) Html Help 制作方法 luodi(无知者无畏), 请进: 我用shell(app.path+"\mdac.exe"),来调用微软数据访问控件2.0,提示出错:命令行语法错误, 求救:如何将剪贴板中的内容放到image控件上 how to get the sytax of customer user object ? jsp中的打印问题 pb中有没有类似iif之类的语句 大虾们,怎样将String 类型转换成float 请问在及时战略中,怎么实现寻路的 我想在状态栏显示时间,有没有属性可以让时间自动变化,而不用其它辅助控件? 不会没人愿意回答这个问题吧,都贴第二次了!! 吃西瓜 我在注冊自創構件時總是出錯,請各位幫忙解決. 关于ado连接sybase的问题,紧急求救!!!(我的最高分了) 29分:flexcell定位 请教一下,关于Delphi COM类型库的问题 大家来谈谈申奥成功对我们的影响吧,我想知道怎么利用这个契机大赚一笔 各位谁喜欢“后街男孩”??喜欢的给分! 请问在DBGRID中改变当前选定行的颜色? 我想在DataSourceDataChange()中实现。 客户端怎么与服务器端通信 为什么我在窗口里修改了一个记录的图片字段后,在数据窗口内不能正常显示? 我要在RedLinux71下安装WEB服务器软件,请部如何做? 如何计算某年某月的天数和每天对应的星期 help!!! 为什么我的D6在编译时出现错误:“Fatal Error QuickRpt.pas(23):File not found:'Dsgnintf.dcu' 帝国时代之农民搞笑版……哈哈 如何用DEBUG的命令取消cmos密码!!!急急急! 请教一个Redhat安装的问题 该死的创新virba128…… 急!!!给tripofdream(梦之旅)和能解决全文检索的高手! 有台WIN95机器启动是时出错缺文件mtrr.vxd,udf.vxd谁能帮我! 对于BMP图象的旋转(90、180)的处理。用BitBlt()能否实现。 《Windows网络编程技术》例子中的一个问题。 急!各位帮忙!!!!!!!!!!! 这个java程序有什么问题吗? 那能下载win2000profesional? oracle sql语句高手请进,为什么这句话无法执行,好像上了锁,来解一下吧! 1.一个高10cm的圆柱,如果把高减少3cm,表面积就比原来减少18.84cm.这个圆柱的体积是多少立方厘米?2.把一个高8dm的圆柱体割拼成一个等底的近似长方体后,表面积增加了24dm²,圆柱体的体积是多 如图:一个圆柱体被截去5厘米后,圆柱的表面积减少了31.4平方厘米,求原来圆柱的表面积是一个圆柱体被截去5厘米后,圆柱的表面积减少了31.4平方厘米,求原来圆柱的表面积是多少?图没标圆柱 圆锥体的表面积公式 一个圆柱体底面周长是18.84cm,高是10cm,这个圆柱体的占地面积是多少? 一个圆柱体,如果把它的高截短了3厘米,表面积就减少了94.2立方CM,体积就减少了多少立方厘米 圆锥体的表面积的公式是什么? 数学题一个圆柱体高减少4厘米,表面积减少125.6厘米,它的体积是多少? 一个圆柱的高是10cm,若高减少4cm,则表面积减少125.6平方cm,求圆柱体的体积? 圆柱体的体积 容积公式一个圆柱体 长585毫米 直径是35毫米 求体积 容积 另一个是长度560毫米 直径23毫米 求体 容积 最好有公式 体积与容积是一个意思吗? 把一个圆柱体的高减少4厘米后,表面积减少50.24平方厘米,求减少部分的体积 从一个圆柱上截下一个高10cm小圆柱体.表面积比原来减少了188.1平方cm截下的圆柱的体积是多少 圆锥,圆柱体表面积体积公式 一段圆柱体钢材,截去10cm长的一段后,表面积减少了314,体积减少了( ) 一个底面直径是8cm,高是16cm圆柱体从中间劈开后得到的图形,这个图形的表面积是多少? 在推导圆柱体公式过程中,拼出的长方体表面积比圆柱大20平厘米,圆柱体侧面积是多少? 把一个直径是10CM的圆柱体沿直径纵向切开以后,表面积增加了100CM,原来这个圆柱的体积是多少立方厘米?把一个直径是8CM的圆柱体沿直径纵向切开以后,表面积增加了112CM,原来这个圆柱的体积是 一个底面直径是8cm,高是16cm的圆柱,如果它的高增加了10cm,它的表面积是多少? 球的表面积公式推导过程个位同志,球的表面积公式到底是如何推出的,为何我推了几次都是 S=π平方*R平方,原理是先割成1个半球,再把这个半球割成无数个小三角形,小三角形的底之和即为圆周 一个圆柱体的高是10CM,如果高减少4CM,则表面积减少125·6.原来圆柱的体积是()立方厘米.最好有算式 一个底面直径是8cm,高是16cm圆柱体从中间劈开后得到的图形,这个图形的表面积是多少?,说清每步 圆柱形表面积的公式是什么? 一个圆柱体,如果把它的高截短3里厘米,表面积就减少94.2平方厘米,体积就减少了( )立方厘米? 把长2米的圆柱体木料锯成两段,表面积增加了6平方米,原来这个圆柱体的体积是() 把一个底面周长为31.4分米的圆柱体的高减少三分之一,表面积就减少了125.6平方分米,原来圆柱体的体积是多少立方分米 一个圆柱体如果它的高截短3CM,表面积就减少94.2平方厘米,体积就减少了多少立方厘米 把一个高8分米的圆柱体割拼成一个与圆柱体等底等高的近似长方体后,表面积增加了24平方分米,把一个高8分米的圆柱体割拼成一个与圆柱体等底等高的近似长方体以后,表面积增加了24平方分 一个圆柱体,底面周长6.28分米,将他平均切成4块,求每块的体积和表面积 一个圆柱体,如果把它的高截短2厘米,表面积就减少62.8平方厘米,体积就减少多少立方厘米?请把具体步骤都写一遍谢谢 把一个高8分米的圆柱体割拼成一个与圆柱体等底的近似长方体后,表面积增加24平方分把整个过程写下来 一个圆柱体高8厘米,底面周长25.12厘米.现在沿着它的直径垂直切开,表面积增加了【 】 把1张周长是80的圆柱体木柴锯成三段相等的圆柱,表面积增加了48平方厘米,原来的圆柱体木柴的体积是 把一个高8分米的圆柱体割拼成一个与圆柱体等底的近似长方体后,表面积增加24平方分米,原来圆柱体体积是多少 一个圆柱体底面周长28.26厘米,高10厘米,求表面积、体积 一个高5厘米的圆柱体,沿底面直径将圆柱体锯成两块,其表面积增加40平方厘米,原来这个圆柱的体积? 把一个高8dm的圆柱体,割拼成一个等底的近似长方体,表面积增加了24平方分米,圆柱体体积是多少? 一个底面周长和高相等的圆柱体如果高降低1厘米他的表面积就要减少6.28平方厘米这个圆柱体的体积是多少?我意思不懂 一个高为5厘米的圆柱,沿底面直径将圆柱锯成两块,其表面积增加了40平方厘米,原来这个圆柱的体积是() 圆柱体表面积公式是什么? 一个圆柱体底面周长和高相等,如果高缩短了2厘米,表面积就减少6.28平方厘米,求这个圆的体积. 一个圆柱体的体积是125.6立方厘米,底面直径是4厘米,它的侧面积是多少平方厘米?2.把一个棱长是6分米的正方体木块,削成一个最大的圆柱体,这个圆柱体的体积是多少立方分米? 求所有计算公式!和所有简算,还有求长方体正方体圆柱体圆锥体的表面积公式的体积公式!(包括字母公式)圆锥不求表面积.计算公式如:axb=bxa 一个底面周长和高相等的圆柱体,如果高降低1厘米,它的表面积就要减少6.28平方厘米,这个圆柱体的体积是多 一个圆柱体,高10厘米,如果高增加2厘米,它的表面积就增加12.56平方厘米,求这个圆柱的侧面积 圆柱体体积公式(字母)急.55555555 一个圆柱体的底面周长和高相等,如果高缩短3厘米,则表面积比原来减少94.2平方厘米,求原来圆柱体的体积?现在回答 一个圆柱体侧面积是62.8平方厘米,地面积是12.56平方厘米,它的表面积是多少平方厘米? 求圆柱体和圆锥体体积的公式 一个圆柱体底面周长和高相等.如果高缩短了2厘米,表面积就减少6.28平方厘米.求这 一个圆柱体,他的直径是10cm,高是10cm,它的表面积是多少? 圆柱体,圆锥体的表面积和容积公式分别是什么?请大家讲清楚点,还有我想知道这个公式几年级教的啊?答案能清晰点不,譬如圆柱体1 表面积2 容积(体积)圆锥体1 表面积2 容积(体积) 在一个地面直径为4分米的圆柱体上截去一个高2分米的小圆柱体,原来圆柱体的表面积减少( )平方米 底面直径是4cm,高是10cm的圆柱体,表面积、侧面积和表面积分别怎么算? 圆锥体 体积 表面积 面积公式 圆柱体 体积 表面积 面积公式看好了 6个公式 从一个高1米,底面直径为4分米的圆柱体上,截下一个高2分米的小圆柱体,原来圆柱体的表面积减少了多少平方分 圆柱的底面半径是2厘米,高是5厘米,圆柱体的底面积\表面积\体积,分别是多少? 若上面圆柱表面积展开图中侧面的长是25.12cm,宽是10cm.本这个圆柱的表面积. 圆锥体表面积公式用字母表示(并把每个字母代表什么讲一下)谢~ 个高是10cm的圆柱,如果它的高减少2cm,表面积就减少18.84cm²,原来圆柱的体积是多少? 一个高为10cm的圆柱,如果他的高增加2cm,那么它的表面积就增加125.6平方厘米,求原来圆柱的表面积. 圆锥体的表面积的计算公式?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn