Delphi中EurekaLog未触发Assert异常的OnExceptionNotify事件问题
问题描述
我用JCL生成调用栈,写了如下测试Delphi异常的方法:
procedure TClientMainCommonForm.Button2Click(Sender: TObject); begin Assert(False); end;
现在测试EurekaLog时,它对硬件异常处理正常,能触发OnExceptionNotify事件,但Assert异常无法触发该事件。我已勾选项目选项中的Assertions复选框,调试时调试器能显示断言信息,但OnExceptionNotify事件始终未触发。
编辑补充:我用Delphi 11.3创建新的VCL应用时,所有功能(包括Assert触发EurekaLog事件)都正常,但我的大型应用却不行。尝试将新项目的eof文件导入现有应用,也没有效果,不知该如何继续。
排查方向与解决方法
开启EurekaLog的断言捕获开关
EurekaLog默认可能未启用断言异常捕获,需手动配置。打开EurekaLog项目设置面板,找到「Exception Types」或「Assertions」相关分类,确保勾选了启用断言处理的选项(例如"Enable assertion handling"),部分版本该选项可能在「Advanced」或「Exception Filter」子菜单下。排查全局AssertHook的自定义覆盖
大型项目中可能存在自定义断言处理逻辑,通过AssertHook全局变量替换了默认处理。搜索项目代码,看是否有AssertHook := 自定义处理过程;这类语句。若存在,需调整自定义逻辑:要么在处理完成后调用EurekaLog的断言处理入口,要么暂时注释该Hook验证是否恢复正常。检查条件编译指令
确认项目未定义禁用断言的编译指令,比如ASSERTIONS_OFF。在项目选项的「Conditional defines」中查看当前构建配置(Debug/Release)的指令列表,确保无相关禁用项。调整EurekaLog初始化顺序
若项目有自定义异常处理初始化代码,可能覆盖或延迟了EurekaLog的初始化。确保EurekaLog的初始化代码(如EurekaLog.Init)在Application.Initialize及其他自定义异常逻辑之前执行。清理EurekaLog配置缓存
大型项目的配置可能存在缓存冲突,尝试删除项目目录下的EurekaLog临时配置文件(如.elcfg之外的临时文件),重新生成配置后再编译测试。排查第三方组件冲突
部分第三方调试、日志组件可能拦截断言异常,导致EurekaLog无法捕获。暂时禁用非必要的第三方组件,逐步排查是否存在冲突。
内容的提问来源于stack exchange,提问作者Roland Bengtsson

