我正在与客户一起在现场工作,并试图帮助他们解决一个复杂的问题。我希望 Delphi 中有一个工具或功能,我们可以使用它来查看内部工作原理,以帮助我们定位问题。
这是我们正在处理的问题的高级概述。这是一个商业应用程序,目前部署在 Delphi 5 中。在过去一年中,该应用程序已迁移到 Delphi XE。迁移几乎完成,但遇到了一些严重错误。
应用程序本身非常庞大,有数百个单元以及许多第三方和自定义组件。在我们遇到的一种特定情况下,创建主窗体,然后在显示主窗体之前终止应用程序。结果是在此终止期间发生崩溃,因为单元正在完成。
调试器正在中断 kernel32 的 RaiseException 函数,该函数由 NotifyNonDelphiException 调用。我们试图设置一个不间断的断点,从 NotifyNonDelphiException 中记录调用堆栈,但这并没有给我们任何有用的东西。调用堆栈仅包含处理异常的方法,即 RtlRaiseStatus 和 KUserExceptionDispatcher。
我们如何识别引发 NotifyNonDelphiException 正在处理的原始异常的代码?
编辑:这是在一个异常实例之后捕获的两张图像。第一个是引发的异常,第二个描绘了异常对话框关闭后的 CPU 窗口。
新编辑:
自从我发布这个问题以来已经一个多星期了,各种答案给我留下了深刻的印象。对最初问题的一些评论是最有价值的,但一些答案本身非常有用。
我对那个客户的访问已经结束,我会要求他们考虑这里发布的答案。虽然我们无法追踪错误的实际来源,但错误的原因非常明显。多年对用户界面进行调整而没有进行认真的重构,导致应用程序的登录过程不稳定。当用户取消登录时,主窗体处于部分初始化状态。当该进程不允许运行时,即用户中止登录时发生的情况,就会出现非常严重的最终确定问题。
该公司已购买 AQTime Pro 以帮助识别未来的问题,但需要重构登录过程,从长远来看将解决问题。
有一次我考虑删除这个问题,但我选择将其发布,因为我相信其他人会发现发布的许多优秀建议提供了丰富的信息。
目前,我接受@Deltics 的回答,因为我讨厌留下没有答案的问题。但是,我要求这个问题的观众也考虑所有其他答案和评论,它们同样有价值。