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