15

因此,在最近的一些更改之后,我们发现我们最古老的应用程序之一有时会在关机时崩溃。这表现为“运行时错误 216”消息或来自 Windows 错误报告的应用程序已停止工作的消息。该应用程序已经OutputDebugString在每一个转折点都发出 -messages 并且 AFAICT 我们自己的所有代码都会正确执行到完成。所有的析构函数都像所有终结部分和类析构函数一样被调用,它们都没有引发任何异常。

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

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


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

4

6 回答 6

12

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

第一次尝试:使用调试 DCU 构建并查看引发错误的单位系统,在那里设置断点。希望您可以在调试器中捕获它并从那里开始工作。

您可能有一个内存错误(悬空指针、空引用等在已经完成的单元中使用 s 字符串常量),最好的技巧是在 sysutils 完成后检查最终确定。您可以通过构建 WITH 调试 dcu,在 sysutils 中将断点设置为最终确定,然后开始逐步执​​行代码,直到发生错误。

于 2011-03-03T14:19:28.417 回答
5

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

于 2011-03-03T14:07:00.633 回答
3

好吧,运行时错误 216是内存问题(访问冲突),您似乎引用了一些当时不存在的对象。

埃马卡德罗写道:

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

您是否尝试在 Sysutils 的终结部分设置断点?

我会尝试使用分配/内存分析器,它不确定您是否会找到错误代码行,但这可能会向您显示发生内存问题的代码的某些部分。

于 2011-03-03T13:34:33.983 回答
2

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

于 2011-03-03T13:18:29.303 回答
2

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

MNG

于 2011-03-03T14:24:01.323 回答
2

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

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

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

这篇文章

于 2011-03-03T21:48:58.443 回答