如何在Delphi服务器应用程序中获取完整的调用堆栈

7

我有一个多层软件,由两个应用程序(GUI、DataSnap服务器)组成。我的DataSnap服务器应用程序有一个bug,在某些时候会导致EAccessViolation错误,如下:

Exception EAccessViolation  in module unidac160.bpl at 00010CB1.
Access Violation at 002B77832 in module unidac160.bpl. Read of  address 0000000C

我想获取完整的调用堆栈并将其记录在文件中。我也使用了EurekaLog,但它只对GUI应用程序有效。

4个回答

9

EurekaLog 对于所有应用程序都非常有效。只需配置它,使其将异常记录到文件中,并且完全不显示异常对话框。


6
+1 但“effective”并不完全正确,更像是“非常有效”(: - user497849

7
我们的开源日志类具有完整调用栈的异常拦截器,包括源代码行。
调试信息高度压缩(比zip或任何其他格式都要好),可选地打包进exe。
开源,适用于Delphi 5到XE2。
在最新版本中(使用源代码库中的版本 - 即目前的1.16版本),它还能够记录库内部的异常(即在.dll或.bpl内部),正如您明确提出的请求。
还有其他功能,例如客户端分析,可以帮助您的客户支持和应用程序增强,从真实数据中获得(不仅在测试平台上)。

哇,Arnaud!你的东西越来越好了! - lkessler
如果您推荐它作为解决方案,最好提供至少一个最简单的代码示例,说明如何添加/激活这样的异常拦截器等。对于专用库来说,通常只需将单元添加到项目中即可,但在这种情况下可能不够。MAP文件的压缩失败,文件大小为36Mb(某个固定大小的内部缓冲区太小了,应该根据文件大小进行计算)。 - Andrei Galatyn
@AndreiGalatyn 昨天已经修复了大型.map文件的问题。您可以在https://github.com/synopse/mORMot/tree/master/SQLite3/Samples/11%20-%20Exception%20logging找到示例。 - Arnaud Bouchez
@Arnaud 看起来夜间构建 2015-02-21_170025 仍然没有包含修复程序,我明天会检查一下。但是乍一看它看起来非常有趣(只有3个单元,具有完整的源代码,并且它们可以做我需要的所有事情和更多)。将尝试在实际项目中进行测试。谢谢! - Andrei Galatyn

4

0

我之前一直使用MemCheck来渲染调用堆栈,但我不确定它是否仍适用于最新的Delphi版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接