12

我正在使用 Delphi TApplication.OnException 事件来捕获未处理的异常

这很好用,但没有提供有关异常发生位置的足够信息,即“灾难性故障”

如何找出导致错误发生的程序?

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  Application.OnException := MyExceptionHandler;
end;

procedure TFrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
begin
  LogException (E.Message);     
  Application.ShowException( E );
end;
4

3 回答 3

25

您可以使用 exceptAddr 变量(系统单元)获取引发异常的内存地址。但是,如果您想要堆栈跟踪,您可以使用 3rdParty 工具 MadExcept、EurekaLog 或开源 JCLDebug(JCL 的一部分)之一。

于 2008-12-07T08:27:02.897 回答
9

最简单和最快的方法是使用JCL异常和调试支持。安装 JCL 后,确保将调试符号插入二进制文件(项目 -> JCL 调试专家 -> 插入此二进制文件的 JDBG 数据 -> 启用)并向项目添加 JCL 异常对话框(文件 -> 新建.. . -> 对话框 -> 异常对话框)。

如果 JCL 安装程序未能将该对话框添加到对象存储库并且它没有出现(发生在我身上几次),请通过将 .pas 和 .dpr 文件从jcl-install-dir\experts\debug\dialog项目中复制并手动添加来手动添加它,或关闭Delphi,%DELHPIDIR%\bin\delphi32.dro在文本编辑器中编辑并添加类似的内容(当然调整路径:)

[P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG]
类型=表单模板
名称=异常对话框
页面=对话框
图标=P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLG.ICO
描述=JCL 应用程序异常对话框
作者=绝地计划
默认主窗体=0
DefaultNewForm=0
祖先=

[P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL]
类型=表单模板
名称 = 带有发送的异常对话框
页面=对话框
图标=P:\DELPHI11\EXTERNALIB\JCL\EXPERTS\DEBUG\DIALOG\EXCEPTDLGMAIL.ICO
描述=JCL 应用程序异常对话框
作者=绝地计划
默认主窗体=0
DefaultNewForm=0
祖先=
于 2008-12-07T08:24:29.563 回答
6

主要相关:Delphi 中的异常处理

于 2008-12-07T09:14:50.583 回答