解决来自csrss.exe的应用程序错误

时间:2013-02-12 09:05:43

标签: delphi debugging application-error csrss

我是传统Delphi应用程序的维护者。在运行此程序的计算机上,有时会出现Application Error标题,其中包含引用此Delphi应用程序的标题以及如下消息:

  

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

     

单击“确定”终止程序。

任务管理器表示属于此消息框的进程为 csrss.exe 。找到导致此错误的根本原因的系统方式是什么?

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

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

2 个答案:

答案 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