剑舞天痕

我的日历

最新评论

访问计数

获取 RSS

Passion 最新的 20 条日志

你现在的位置:剑舞天痕>俺没分类>介绍一异常记录工具EurekaLog

介绍一异常记录工具EurekaLog [617,2004]

Passion 发表在 俺没分类

Delphi的异常处理机制从底层实现来说比较复杂,但对于应用程序这一层来说,却再简单不过了。
当抛出异常的时候,只要异常对象没被捕捉,就会层层上抛,直到有东西处理它为止。如果应用程序
自己没写异常处理,则默认调用Application.HandleException来处理,也就是显示一个出错红框,
这个红框一般只是显示简单的异常信息。
异常的抛出往往有助于调试和Bug修改,而异常抛出时的简短错误信息一般满足不了需要,因此就
出现了外挂式的异常处理库。这种库存在的理由是:Delphi在SysUtils单元的初始化部分设置了异常
处理的处理程序,一个Project一般是SysUtils单元在比较早的时候开始初始化(Forms单元是第一个
单元,它所Uses的Messages和Windows单元都没有initialization部分,所以SysUtils单元是第一个
执行初始化过程的单元),它里头的initialization部分的InitExceptions设置了异常处理的初始
过程,其中有类似于下面的语句。

ErrorProc := @ErrorHandler;
ExceptProc := @ExceptHandler;

这意味着,ErrorProc这样的函数指针变量会在异常产生的时候被调用,至于具体调用的是啥,则
完全取决于外部过程把什么函数地址赋给了这些指针。Delphi默认的SysUtils单元设置了基本的异常
处理。如果要写一个自己的自定义异常处理库,则需要在自己的过程中挂接这几个异常处理地址指针。
JCL中有类似的机制,这里介绍的Eurekalog也是一个典型的产品。
EurekaLog这款异常记录工具功能比较强大,能够记录异常产生时的堆栈、出错地址、出错源码行
号、CPU状态、模块名和其他乱七八糟的尽可能多的信息,而且能够针对不同类型的Delphi程序如GUI、
控制台程序,Web应用程序等应用不同的异常信息显示形式,甚至能够记录异常信息并自动发邮件到指
定地址。
瞧瞧它异常抛出的时候所显示的详细信息框框吧。点击Details按钮后,界面变化如图。

图片如下:

  东西不少吧?它不仅能以各种方式记录和处理异常,甚至还能自动判断程序是否进入了死循环。估计
是定时朝程序发消息再检测返回信息的。据它说,它安装后,会增加编译的程序的体积大概50k字节。
这50k字节就包括了n多异常记录处理分类的功能。
  安装了EureKalog后,它会自动在Delphi/C++Builder的项目文件中加入ExceptionLog单元,而且是
插入在Forms单元之前,但它自己Uses了SysUtils单元,因此会在SysUtils进行异常初始化之后,自己重新
挂接异常处理函数指针,从而获得了异常处理权(开始还有个疑问,以为它是先于SysUtils挂接异常的
,所以才奇怪,SysUtils初始化的时候难道不会覆盖它?后来反编译一下ExceptionLog单元才知道,SysUtils
被强迫先加载,而它自己却是“后来居上”的)。
  由于EurekaLog安装后会在IDE中被加载,因此它也能捕获IDE的异常,这一点对于我们的专家包的调试
来说,应该是很有用处的。—— 估计最有用的功能就是记录异常发生的源码行号了。^_^
  EurekaLog分标准、专业、企业三种版本,企业版带源码,目前最新版本是4.6.4。试用版可去它的主页
下载,http://www.eurekalog.com/ 没付钱的时候,所编译的程序只能使用15天,超过15天就退出。要解掉这
个问题,只要在ExceptionLog.dcu里头找到7455A1,把74改作EB跳转,似乎就没过期的问题了(只针对D5)。

评论(共 条) 我要评论

{CommentContent}

Posted by {CommentAuthor} at {CommentTime} | {CommentUrl}