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

时间:2011-03-03 13:11:18

标签: delphi debugging crash application-shutdown

因此,在最近的一些更改后,我们发现我们最老的应用程序之一有时会在关机时崩溃。这表现为“运行时错误216”消息的形式,或者来自Windows错误报告的消息,表明应用程序已停止工作。应用程序已经发出OutputDebugString - 每个回合都有消息,而AFAICT我们自己的所有代码都会正确执行完成。所有析构函数都被称为所有最终化部分和类析构函数,其中没有一个会引发任何异常。

此外,madExcept和FastMM4的完全调试模式似乎都没有什么可抱怨的(尽管这可能是一个错误的结论,因为甚至在这些组件自己的终结代码运行之前就可能发生崩溃)。

那么,你会做什么?你会从哪里开始的?


这个问题应该更多地讲述这类问题的一般方法,而不是我目前面临的具体实例,所以我故意遗漏细节。请随意询问您是否认为它们可能与调试方法的选择相关,我稍后会添加它们。

6 个答案:

答案 0 :(得分:12)

运行时错误216表示您具有Av(访问冲突),并且SysUtils已停止将这些错误转换为异常。

首先尝试:使用调试DCU构建并查看引发错误的单元系统,在那里设置断点。希望你能在调试器中捕获它并从那里开始工作。

你可能有一个内存错误(悬挂指针,空引用等等在已经完成的单元中使用s字符串常量),最好的办法是在sysutils完成后检查完成。您可以通过构建WITH debug dcu,将断点设置为sysutils中的finalization并开始逐步执​​行代码直到发生错误来完成此操作。

答案 1 :(得分:5)

您使用的是运行时包吗?我以前见过类似的问题。如果要跨包边界共享全局变量或接口,则必须确保在卸载该包之前清除对属于某个包的类的所有引用;否则他们会尝试将虚拟调用放入不再有效的内存中。

答案 2 :(得分:3)

Runtime error 216是内存问题(Access violation),好像你引用了一些在那个时间点不存在的Object。

Emarcadero写道:

使用SysUtils类的应用程序将大多数运行时错误映射到例外,这允许您的应用程序在不终止的情况下解决错误

您是否尝试在Sysutils的最终部分设置一个breackpoint?

我会尝试使用Allocation / Memory Profiler,但不确定您是否会找到错误代码行,但这可能会显示代码中发生内存问题的部分内容。

答案 3 :(得分:2)

你可能遇到指针问题。某些事件或方法试图在不再存在的对象上运行。

答案 4 :(得分:2)

“运行时错误216”来自Windows本身,而不是Delphi异常处理程序。我发现它是由在单元的初始化和终结部分中运行的代码引起的,这些代码在Delphi异常处理程序启动之前执行。特别是。需要通过Delphi应用程序终止后运行的终结代码卸载的COM对象将导致此类错误。所以检查那些东西。

MNG

答案 5 :(得分:2)

像其他人说的那样:216表示SysUtils关闭后的AV。通常,在SysUtils之后关闭(并且有机会提升AV)的唯一因素是系统单元。具体来说:内存管理器。

因此,关机时的运行时错误216通常意味着应用程序中存在内存损坏错误。

这可以很容易解决 - 只需在内存管理器中启用完全调试模式或使用调试内存管理器。然而,有时候,很难找到它。但是你可以先从MM的调试模式开始。

请参阅this article