【问题标题】:Hunting down application errors coming from csrss.exe寻找来自 csrss.exe 的应用程序错误
【发布时间】:2013-02-12 09:05:42
【问题描述】:

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

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

单击“确定”终止程序。

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

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

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

【问题讨论】:

    标签: delphi debugging application-error csrss


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

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

    简介

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

    示例

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      相关资源
      最近更新 更多