如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

因此,在最近的一些更改后,我们发现我们最老的应用程序之一有时会在关机时崩溃。这表现为“运行时错误216”消息的形式,或者来自Windows错误报告的消息,表明应用程序已停止工作。应用程序已经在每个回合发出
OutputDebugString
-消息,AFAICT我们自己的所有代码都正确执行完成。所有析构函数都被称为所有终结部分和类析构函数,其中没有一个会引发任何异常。 此外,madExcept和FastMM4的完全调试模式似乎都没有什么可抱怨的(尽管这可能是一个错误的结论,因为甚至在这些组件自己的终结代码运行之前就可能发生崩溃)。 那么,你会做什么?你会从哪里开始的? 这个问题应该更多地关于这类问题的一般方法,而不是我目前面临的具体实例,所以我故意遗漏细节。请随意询问您是否认为它们可能与调试方法的选择相关,我稍后会添加它们。     
已邀请:
运行时错误216表示您具有Av(访问冲突),并且SysUtils已停止将这些错误转换为异常。 首先尝试:使用调试DCU构建并查看引发错误的单元系统,在那里设置断点。希望你能在调试器中捕获它并从那里开始工作。 您可能有一个内存错误(悬挂指针,空引用等等在已经完成的单元中使用s字符串常量),最好的方法是在sysutils完成后检查完成。您可以通过构建WITH debug dcu,将断点设置为sysutils中的finalization并开始逐步执​​行代码直到发生错误来完成此操作。     
你在使用运行时包吗?我以前见过类似的问题。如果要跨包边界共享全局变量或接口,则必须确保在卸载该包之前清除对属于某个包的类的所有引用;否则他们会尝试将虚拟调用放入不再有效的内存中。     
那么运行时错误216是内存问题(访问冲突),似乎你引用了一些在那个时间点不存在的对象。 Emarcadero写道: 使用SysUtils类的应用程序将大多数运行时错误映射到Exceptions,这允许您的应用程序在不终止的情况下解决错误 您是否尝试在Sysutils的最终部分设置一个breackpoint? 我会尝试使用Allocation / Memory Profiler,它不确定你会找到错误代码行,但这可能会显示代码中发生内存问题的部分内容。     
你可能有一个指针问题。某些事件或方法试图在不再存在的对象上运行。     
“运行时错误216”来自Windows本身,而不是Delphi异常处理程序。我发现它是由在单元的初始化和终结部分中运行的代码引起的,这些代码在Delphi异常处理程序启动之前执行。特别是。需要通过Delphi应用程序终止后运行的终结代码卸载的COM对象将导致此类错误。所以检查那些东西。 MNG     
像其他人说的那样:216意味着在SysUtils关闭后AV。通常,在SysUtils之后关闭(并且有机会提升AV)的唯一因素是系统单元。特别是:内存管理器。 因此,关闭时的运行时错误216通常意味着应用程序中的内存损坏错误。 这可以很容易解决 - 只需在内存管理器中启用完全调试模式或使用调试内存管理器。然而,有时候,很难找到它。但是你可以先从MM的调试模式开始。 看到这篇文章。     

要回复问题请先登录注册