8

我有一个奇怪的间歇性崩溃,只有在我无法解决的某些情况下才会发生,我正在寻求 SO 的建议来解决它。

错误

在明显的随机点上,Windows 显示“[App] 已停止工作”对话框。它是ntdll.dll中的一个APPCRASH,异常代码4000001f,异常偏移000a2562。这就是它变得棘手的地方:这只发生在调试器下运行应用程序时。但是,调试器没有捕获此异常,并且在 Windows 显示此对话框时,IDE 没有响应。正常运行时不会出现此错误,即不在 IDE 调试器中。

Windows 崩溃对话框的屏幕截图

我无法在调试器之外重现它,所以当它已经崩溃时我无法运行程序并附加它。当 Windows 显示此对话框时,我无法暂停执行,因为 IDE 没有响应。我可以手动跟踪代码行以查看它发生的位置。有几个,它发生的地方显然是随机的。有一段时间在显示窗口(或新窗体)时发生,有一段时间在创建线程时发生。

编辑:我已将其跟踪到 IDE:如果我在断点处暂停并单击“线程状态”选项卡,程序将立即崩溃并出现上述对话框,即使理论上它已暂停。在这种情况下,IDE 保持响应。这真的很奇怪。

更多信息

我刚刚将我的开发环境移至VMWare Fusion。在我的新计算机上从我的旧(本机 Windows)计算机运行构建时也会出现该错误;那台旧计算机上的相同 EXE 文件没有发生这种情况。这让我想知道它是否与 Fusion 或我的新设置中的某些东西有关。

我在跑步:

  • Windows 7 Pro x64 on WMWare Fusion 3.1.3 on OSX Lion 10.7.1,全部更新。Fusion 在我的一个屏幕上以“全屏”模式运行。
  • 本机(不在 VM 中)运行 Windows 7 的同事不会遇到此问题。我也没有在我的旧 Vista 计算机上。
  • Embarcadero RAD Studio 2010,完全更新(我希望;大约有五个更新,并且将它们全部按顺序排列是很棘手的。)我安装了 DDevExtensions 2.4.1,并且还安装了最新的 IDE Fix Pack:卸载这两个都没有效果。
  • 该应用程序主要是用 C++ 编写的,带有 Delphi 的片段。它是 32 位的。
  • 我们使用EurekaLog,但它也没有捕获到异常。(通常,调试器会先捕获异常,然后再由 EurekaLog 捕获。)
  • 运行调试版本(没有 EurekaLog、额外的调试信息等,调试 DCU 设置为 true)也会重现它。但是,C++Builder 项目设置对话框的 Delphi 链接页面上的“调试 DCUs”选项似乎没有效果 - 我无法进入 VCL 代码并找到实际触发错误的行。
  • Codeguard(检测内存访问错误、双重释放、释放内存中的访问、缓冲区溢出等)不报告任何内容。
4

4 回答 4

8

这具有内存损坏的所有特征。它仅在您在一个特定环境下运行时出现,并且每次出现在不同的位置。两种典型症状。

我知道的最好的调试方法是下载完整的 FastMM 并在启用完整调试选项的情况下运行。

如果这没有帮助,那么您将不得不一一删除部分代码,直到您可以隔离问题为止。

我在 D2010 中看到的另一个问题是将本地类定义(即类内的类)与泛型混合时出现的问题。生成的代码很好,但调试 DCU 是错误的,当单步执行代码时,调试器会跳转到错误的文件并在不久之后死掉。您似乎没有完全相同的问题,但 IDE 死亡有相似之处。

最后,我建议您怀疑自己的代码而不是 VMware。总是很想责怪别的东西,但根据我的经验,每当我这样做时,最终总是我的代码!

于 2011-08-22T07:16:00.187 回答
3

我遇到了一个非常相似的问题。我也一直在开发一个 .dll,当我在代码中的任何位置设置断点时,Delphi 在源代码行停止,主机应用程序立即崩溃。

在调试布局中关闭“线程状态窗口”“修复”了该问题。我正在使用 Windows 7 64 位和 Delphi XE3。

于 2013-06-26T14:47:19.613 回答
2

4000001F 是 STATUS_WX86_BREAKPOINT

换句话说,它是 INT 3,IDE 没有处理它。

由于它是在 NTDLL 中引发的 - 我猜这表明系统堆中的内存损坏。请记住,某些 Windows 代码在调试器下运行时会切换到调试器版本。这就是为什么当应用程序在调试器之外作为独立运行时您无法重现这一点 - 因为没有生成断点。

您可以在完全调试模式下尝试 FastMM,但我认为它不会对您有所帮助。损坏不会发生在您的内存中,而是发生在系统内存中。是的,也许内存分配方案会改变——你的腐败会在你的代码/内存中暴露出来……可能是。尝试使用自上而下的分配,尝试使用 SafeMM...

另一种可能的方法是使用Application Verifier

也可以看看:

于 2015-05-21T22:24:12.340 回答
1

检查项目 dsk 文件并确保它没有指向错误单元的引用。修复方法是在编辑器中打开 dsk 并将文件位置更改为正确的位置。

于 2013-12-11T19:27:55.367 回答