3

我是旧版 Delphi 应用程序的维护者。在运行这个程序的机器上,Application Error有时会出现一个引用这个 Delphi 应用程序的标题和如下所示的消息:

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

单击确定以终止程序。

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

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

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

4

2 回答 2

7

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

如果您不能让您的应用程序在调试器下失败,那么您需要向它添加一些诊断。我建议使用 madExcept 或 EurekaLog 之类的工具来执行此操作。我个人使用 madExcept 并且不能高度推荐它。据我了解,EurekaLog 也是一款不错的产品。

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

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

于 2013-02-12T09:32:55.290 回答
6

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

您可以使用Windbg等离线分析转储文件。虽然一开始这似乎让人难以接受,但我坚信让自己跟上 Windbg 的速度会收获很多。

介绍

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

例子

启动一个进程,然后监视它是否有异常:

   C:\>procdump -e 1 -f "" -x c:\dumps consume.exe
于 2013-02-12T11:48:02.637 回答