- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
捕捉UnhandledException
健壮应用程序异常信息收集,捕捉UnhandledException,并生成dump文件 最近负责的一个项目的应用系统老是原因不明的结束。因为该应用程序是Windows service的缘故,调试起来很麻烦,再加上问题一直找不到重现的办法。而当问题发生后,日志内并没有任何记录,同时该应用的进程也已经结束,在系统事件日志和Dr.Watson里面也没有发现什么有用的信息。考虑到重现问题需要很多的信息支持,另外程序确实需要在发生异常时自身收集更多的信息,所以为程序加入未捕捉异常的处理,该处理中包含了通过代码生成Dump文件。大致的做法是,加入一个AppDomain.CurrentDomain.UnhandledException事件,以在发现未捕捉异常时触发;然后就通过windbg的API函数:MiniDumpWriteDump生成dump文件,以便分析问题。以下处理未捕捉异常的AppDomain.CurrentDomain.UnhandledException事件的示例代码:?Code//在程序初始阶段,将处理函数加入到AppDomain.CurrentDomain.UnhandledException事件中,以便发现未捕捉异常时触发。//该语句放到程序初始化的函数中即可??AppDomain.CurrentDomain.UnhandledException?+=?new?UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);??//这是处理函数,与初始化函数同在一个class内????????void?CurrentDomain_UnhandledException(object?sender,?UnhandledExceptionEventArgs?e)????????{????????????Exception?ex?=?e.ExceptionObject?as?Exception;????//这两个是自定义的日志记录函数,????????//????debugLog.Error(Unhandled?Exception?occur?in?Method:?+?ex.TargetSite.ToString());????????//????debugLog.Error(ex.ToString());????//生成dump文件????????????MiniDump.TryDump(@D:\MiniDmp.dmp,?MiniDump.MiniDumpType.WithFullMemory);????????}?这样定义完成后,程序中所有没有被try...catch捕获的Exception都将触发事件AppDomain.CurrentDomain.UnhandledException。事件处理完成后,异常将继续向上抛,程序会因为该未捕捉异常而终止,同时Windows的事件日志会记录该异常,然后触发系统默认的调试引擎。因此,响应AppDomain.CurrentDomain.UnhandledException事件并不代表你的应用不会因为未捕捉异常而终止,AppDomain.CurrentDomain.UnhandledException事件仅仅是让你在遇到该情况下能自动收集更多的信息而已。下面我们讲讲如何生成dump文件。通过代码生成dump文件,需要使用windbg的dbghelp.dll(该dll可以在windbg的安装目录中找到)中的API函数:MiniDumpWriteDump(更详细的用法可以MSDN)。原理不多说了,无非就是import dll然后就是调用而已。具体代码如下:?Codeusing?System;using?System.Collections.Generic;using?System.Text;using?System.Runtime.InteropServices;using?System.Diagnostics;using?System.IO;using?System.Threading;namespace?DumpCreator{????/**/????///?summary????///?该类要使用在windows?5.1?以后的版本,如果你的windows很旧,就把Windbg里面的dll拷贝过来,一般都没有问题????///?DbgHelp.dll?是windows自带的?dll文件?。????///?/summary????public?static?class?MiniDump????{????????/**/????????/**?导入DbgHelp.dll*/????????[DllImport(DbgHel
文档评论(0)