Delphi 查找来自csrss.exe的应用程序错误

Delphi 查找来自csrss.exe的应用程序错误,delphi,debugging,application-error,csrss,Delphi,Debugging,Application Error,Csrss,我是传统Delphi应用程序的维护者。在运行此程序的计算机上,有时会出现应用程序错误,标题指向此Delphi应用程序,并显示如下消息: “…”处的指令引用了“…”处的内存。无法“读取”内存 单击“确定”终止程序 任务管理器说属于此消息框的进程是。找到这一错误的根本原因的系统方法是什么 问题是,这个Delphi程序相当复杂,错误消息出现的相对较少,因此我无法简单地单步遍历代码并找到导致错误的部分。此外,应用程序会自动运行,不会被用户打断,因此我无法询问用户在消息出现时会做什么。应用程序和系统日志没

我是传统Delphi应用程序的维护者。在运行此程序的计算机上,有时会出现
应用程序错误
,标题指向此Delphi应用程序,并显示如下消息:

“…”处的指令引用了“…”处的内存。无法“读取”内存

单击“确定”终止程序

任务管理器说属于此消息框的进程是。找到这一错误的根本原因的系统方法是什么

问题是,这个Delphi程序相当复杂,错误消息出现的相对较少,因此我无法简单地单步遍历代码并找到导致错误的部分。此外,应用程序会自动运行,不会被用户打断,因此我无法询问用户在消息出现时会做什么。应用程序和系统日志没有显示任何问题。当消息框出现时,应用程序不会停止工作

我希望以前有人遇到过这样的错误消息,并且能够解决这个问题。提前感谢您的帮助。

支持Windows控制台。我希望您的应用程序以控制台子系统为目标

如果无法使应用程序在调试器下失败,则需要向其添加一些诊断。我建议使用像madExcept或EurekaLog这样的工具来实现这一点。就我个人而言,我使用madExcept,但推荐度不够高。据我所知,EurekaLog也是一款优秀的产品

将其中一个工具与应用程序集成,下次出现故障时,它将生成详细的诊断报告。最重要的是,您将获得进程中每个线程的堆栈跟踪。出错线程的堆栈跟踪有望引导您找到程序错误的根本原因


我的疑问是,如果故障发生在
csrss
中,那么在您的过程中包括诊断可能不会产生结果。您的应用程序可能已经出现故障,这反过来又导致了
csrss
中的错误消息。在这种情况下,应用程序中的诊断将有所帮助。如果没有,那么您可能需要找到一种方法,使故障发生在您的流程中。

除了David的建议之外,我建议使用sysinternals来监视流程,并在发生未处理的异常时让它编写转储文件

您可以使用等脱机分析转储文件。虽然一开始这似乎有些过分,但我坚信,让自己跟上Windbg的速度会有很多好处

导言

ProcDump是一个命令行实用程序,其主要目的是监视 一种应用程序,用于CPU峰值和在故障期间生成崩溃转储 管理员或开发人员可以用来确定 刺的原因。ProcDump还包括挂起窗口监视 (使用与Windows和任务相同的窗口挂起定义) 管理器(使用),未经处理的异常监视,并可以生成转储 基于系统性能计数器的值

示例

启动流程,然后监视其是否存在异常:

   C:\>procdump -e 1 -f "" -x c:\dumps consume.exe

+谢谢你,大卫。我们在开发阶段确实使用了Eureka,但在发布版本中它被关闭了。我今天一定要试一试,并在这里报告我的发现。在发布版本中关闭?!你为什么要这么做?!那正是你需要它的时候。我可能会修复一个月左右的错误纯粹是从客户提供给我的错误报告。这些东西就像金粉一样。你是对的,但在这种情况下没有用户,因为应用程序会自动运行。问题是,Eureka在每个异常情况下都会打开一个漂亮的消息框,并停止应用程序,这在本例中是不可接受的。我不知道Eureka的情况,但肯定可以配置这些东西。他们当然可以帮我。对我来说,您可以将诊断保存到文件中。我在DLL版本的代码中就是这样做的,它可以在没有UI的情况下运行。当然你也可以为尤里卡做同样的事情。我可以证明我可以配置为不显示任何内容,但如果尤里卡没有,我会非常惊讶。