如何跟踪仅在调试器下发生的间歇性崩溃,但是没有被它捕获?

Dav*_*vid 8 delphi crash c++builder vmware-fusion

我有一个奇怪的间歇性崩溃,只有在我解决问题的某些情况下才会发生,我正在寻求如何解决它的建议.

错误

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

Windows崩溃对话框的屏幕截图

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

编辑:我已将其跟踪到IDE:如果我暂停一个断点并单击"线程状态"选项卡,程序将立即使用上面的对话框崩溃,即使它理论上已暂停.在这种情况下,IDE仍然保持响应.这真的很奇怪.

更多信息

我刚刚将我的开发环境转移到了VMWare Fusion.从我的新计算机上的旧(本机Windows)计算机运行构建时,也会发生该错误; 它在旧计算机上的相同EXE文件中没有出现.这让我想知道它是否与Fusion或我的新设置中的某些内容有关.

我在跑步:

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

Dav*_*nan 8

这具有内存损坏的所有标志.它仅在您在特定环境下运行时出现,并且每次都出现在不同的位置.两种经典症状.

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

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

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

最后,我建议您怀疑自己的代码而不是VMware.总是很容易责怪其他事情,但根据我的经验,每当我这样做时,最终总是我的代码!

  • 免费后的内存访问可以工作多年,直到某些东西,例如不同的系统干扰它.我有类似的经验,代码失败了客户端但不适合我们.花了很长时间才终于解决了问题. (2认同)