在程序异常中记录堆栈信息(使用ExWatcher)

在我们编写程序的时候可通过IDE自带的调试环境捕捉到异常(Except)错误,并能查看到相关的信息以便我们修正程序中的问题。但当软件被发布出去后,因为所部署运行的环境与我们的调试环境有很大区别,即使在是调试环境中测试过非常完美的程序,也很难保证在实际运行中不出现任何错误。当程序发生错误它往往是抛出一个红叉的警告框来告诉我们它出错了,但这对我们来说却像是一个不懂表达的小孩,只是一味的告诉你它身上疼,却不懂得告诉你它哪里疼、怎么样疼。幸好有一个叫ExWatcher的组件能够教会你的小孩怎么说出它身上的疼痛。

ExWatcher组件专门用来捕捉程序异常,并记录异常发生的位置和Call Stack信息,和我们常用的Application.OnException不同,它替换了程序的异常处理函数并把异常分为DelphiException、DelphiSafeCallException、SystemException、SystemSafeCallException四类,并为这四类异常提供不同的回调函数。同时它是基于SEH(Structured Exception Handling)的,需要使用dbg文件,也就是说需要把与程序同名的dbg文件一齐发布。

有关ExWatcher的实现原理请参见以下文章:
Advanced exception handler to find the exception source file name, call stack and all other related information

Advanced exception handler to find the exception source, call stack and more

ExWatcher的下载地址:http://www.clevercomponents.com/articles/article012/ExWatcher.zip
DEMO程序下载:http://www.clevercomponents.com/articles/article012/Demo.zip

要生成dbg文件,需一个小工具map2dbg,它能够将Dephi的MAP文件转换成dbg格式文件,要生成MAP文件请修改project  ->  options  ->  Linker  ->  Map   file 选择detailed,或者在需要的地方加入编译指令{$D+,L+} 。

map2dbg下载地址:http://code.google.com/p/map2dbg/

生成不了map时,请删除dproj文件后,用IDE打开dpr,由IDE重建dproj。

http://blog.csdn.net/nhconch/article/details/3859394

时间: 2024-08-09 22:01:38

在程序异常中记录堆栈信息(使用ExWatcher)的相关文章

Win下,通过Jstack截取Java进程中的堆栈信息

在Java软件的使用过程中,有时会莫名的出现奇怪的问题.而这些问题常常无法使用日志信息定位,这时我们就需要通过查看进程内部线程的堆栈调用关系来分析问题出在哪里. 举个例子,当我们在做某个操作时,莫名的会弹出多个警告框,其中有些信息是正常的,有些则不是.对于这些错误的警告信息,我们该如何定位是哪个位置的代码出现了错误弹出的框呢? 我们就需要在弹框以后,去查看软件的各个线程,去查找究竟是哪个线程导致了该问题.可是有时因为环境.时间等问题,我们根本不能拿着IDE去调试(你总不能拿着笔记本到客户那里说,

主动抛异常获取调试堆栈信息

android开发中常见的调试方法有: 下断点(break point)调试跟踪: 此方法局限性最大,要求程序是可中断,且非系统应用等. 打印日志(systemout.log都是此类): 此方法应用最广泛,也常在应用整个流程的关键位置或方法上记录,方便bug出现时的状态及流程获取.但是日志也仅局限于单个代码位置的状态记录,难以获取更广的上下文信息.本文要补充讨论的内容就是要解决这个问题: 通过获取命令调用的堆栈,来获取更全面的调试信息.至于如何获取这边提供主动抛异常的方法: try { thro

转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常保存到数据库中,所以就到网上搜了下专门的日志记录工具,一搜果然很多,比如:log4net,NLog,EntLib Logging等等,但是还是log4net名气最大,所以就下载下来试用了一番,果然很方便,其涵盖了所有常用的日志记录方式具体的可以看下表: AdoNetAppender 将日志记录到数据

Log4Net异常日志记录在asp.net mvc3.0的应用

前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual Studio2010(Asp.Net Mvc3.0)中使用log4net快速创建系统日志,如何扩展以输出自定义字段. 用户可以从http://logging.apache.org/log4net/下载log4net的源代码.解压软件包后,在解压的src目录下将log4net.sln载入Visual

其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常

其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载.有关详细信息,请参阅内部异常 解决方法 在 App.config 的 configuration 中加入下面的内容  其中 红底部分是你调用的Npgsql的版本号 <system.data> <DbProviderFactories> <remove invariant="Npgsql"/> <add name="Npgs

谁记录了mysql error log中的超长信息

[问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题,为什么会记录这些信息,是谁记录的这些信息,分析的过程比较周折. Status information: Current dir: Running threads: 2452  Stack size: 262144 Current locks: lock: 0x7f783f5233f0: Key c

Slf4j打印异常的堆栈信息

1.前言 直接用logger.info("异常信息为:"+e)或者logger.info(e.getMessage())只能记录到异常的描述信息,却没有其异常具体发生在哪一行代码.这样即使通过日志发现出现了异常,也没法马上定位问题.因此就催生了一个想法,打印日志是否能像在IDE本地跑程序时出现未捕获的异常时,控制台能打印出完整的错误堆栈信息. 原文地址:https://www.cnblogs.com/gavincoder/p/10092187.html

winform程序捕获全局异常,对错误信息写入日志并弹窗

使用场景:在winform程序中如果没对方法进行try catch操作,若方法内出错,则整个程序报错并退出,如下图 如果程序已在客户手中,若没对错误的详细信息进行拍照,我们则不知道错误原因是什么.我们需要能捕获整个程序的错误信息,一旦程序出错,则跳到我们指定的方法中,执行错误信息的报错以及友好的错误提示(也可以不提示,直接退出程序). 实现代码如下:(代码放置位置:在Program.cs文件中的Main方法中) using System; using System.Collections.Gen

Python中获取异常(Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序结构.如下所示 try: ... except Exception as e: ... 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息 'integer division or modulo by zero' 2.repr(e) 给出较全的异常信息,包括异