我是传统Delphi应用程序的维护者。在运行此程序的计算机上,有时会出现Application Error
标题,其中包含引用此Delphi应用程序的标题以及如下消息:
“...”处的指令引用了“......”处的内存。内存无法“读取”。
单击“确定”终止程序。
任务管理器表示属于此消息框的进程为 csrss.exe 。找到导致此错误的根本原因的系统方式是什么?
问题是,这个Delphi程序相当复杂,并且错误消息相对较少出现,因此我不能简单地逐步执行代码并找到导致错误的部分。此外,应用程序会自动运行,无需用户中断,因此我无法询问用户当消息出现时她做了什么。应用程序和系统日志不表示任何问题。当消息框存在时,应用程序不会停止工作。
我希望有人之前遇到过这样的错误消息,并且能够解决问题。感谢您的帮助。
答案 0 :(得分:7)
csrss
支持Windows控制台。我希望您的应用程序以控制台子系统为目标。
如果在调试器下无法使应用程序失败,则需要为其添加一些诊断程序。我建议使用像madExcept或EurekaLog这样的工具来做到这一点。我个人使用madExcept并且不能足够推荐它。据我所知,EurekaLog也是一款很好的产品。
将这些工具中的一个与您的应用程序集成,下次出现故障时,将生成详细的诊断报告。最重要的是,您将获得流程中每个线程的堆栈跟踪。错误线程的堆栈跟踪应该会引导您找到程序错误的根本原因。
我怀疑的是,如果csrss
中发生了错误,那么在您的过程中包含诊断可能不会产生结果。您的应用程序已经出现故障,这导致csrss
中的错误消息,这似乎是合理的。在这种情况下,应用程序中的诊断将有所帮助如果没有,那么您可能需要找到一种方法来在您的过程中发生故障。
答案 1 :(得分:6)
除了David的建议之外,我还建议使用sysinternals中的procdump来监视进程,并在发生未处理的异常时编写转储文件。
您可以使用Windbg等离线分析转储文件。虽然起初看起来可能过于镶嵌,但我坚信通过使用Windbg让自己快速上手可以获得很多好处。
<强>简介强>
ProcDump是一个命令行实用程序,其主要用途是监视 一个应用程序的CPU峰值和生成崩溃转储期间 管理员或开发人员可以用来确定的尖峰 穗的原因。 ProcDump还包括挂窗监控 (使用相同的窗口定义挂起Windows和Task 管理器使用),未处理的异常监控并可以生成转储 基于系统性能计数器的值。
示例强>
启动一个进程,然后监视它是否有异常:
C:\>procdump -e 1 -f "" -x c:\dumps consume.exe