如何在Windows 8上调试Double.TryParse中的偶发故障



在Windows8中测试现有应用程序时,我遇到了一个非常奇怪的崩溃。主应用程序是用DelphiXE(Win32)编写的,它使用COM互操作对.Net程序集进行一些调用。当前使用的.Net版本是3.5。

当应用程序在新安装的Windows 8上执行时,它会崩溃多达10次,然后突然开始正常运行。一旦它开始执行OK,它将继续执行。不会显示错误日志或错误消息。应用程序只是挂起或停止工作。

我在4个不同的Win8安装上得到了相同的结果,包括物理和虚拟安装。

我已经能够进行一些远程调试,并在尝试解析非数值时设法将错误追踪到.Net方法Double.TryParse

Try/Catch块中的Double.Parse也不起作用。

主要程序集是用Delphi Prism编写的,但我已经能够使用VS2010用C#编写的测试程序集来重现错误。

.Net 4似乎工作正常,但由于缺少对Oracle的支持,我们现在无法升级。

该程序在以前版本的Windows上运行正常,在Windows Server 2012上也运行正常。

任何提示或建议都将不胜感激。

添加:当从另一个用C#/托管代码编写的测试应用程序调用测试程序集时,我忘记提到测试程序集工作正常。只有Delphi(Win32)、.Net 3.5、COM InterOp和Windows 8的组合才会导致崩溃。

我也很困惑为什么应用程序在崩溃了10次之后突然开始工作。

如果没有代码,很难进行故障排除,但我可以提出一些建议。

你真的安装了.Net 3.5运行时吗?运行真正的.Net 3.5运行时和在.Net 4.0(预装Windows 8)下"模拟"它之间存在一些差异。

接下来,您可以尝试通过创建/修改程序集清单来强制应用程序在特定的运行时版本下运行。

是否强制应用程序在特定的.NET运行时版本下运行?

最后,您可以尝试强制应用程序进入32位空间,看看64位是否有问题。不幸的是,这是由进程控制的,DLL无法更改。NET可执行文件可以在项目属性中或通过编译器标志指定:

http://msdn.microsoft.com/en-us/library/zekwfyz4(VS.80).aspx

由于只有当.NET代码在Delphi.NET主机下运行时才会发生这种情况,我想看看您是否可以在Delphi中控制创建的.NET AppDomain。我不是Delphi开发人员,所以我不能在这里帮你,但看起来有一个名为JCL的库,它可以让你更好地控制如何将代码加载到AppDomain中。

在Delphi程序中托管.NET运行时

如果您能够追踪到这一点,我建议您与Microsoft支持人员分享您的发现,以便他们能够潜在地解决它(假设它在他们的控制范围内解决)。

Delphi更改了.NET不允许的CPU位。它为某种溢出抛出异常。从Delphi方面试试这样的东西:

var lSave: Word;

lSave := Get8087CW;
Set8087CW($037f);
<YOURCALLTO.NET>
Set8087CW(lSave);

微软似乎自己解决了这个问题。如果您在Windows Update上安装了Windows 8的最新修复程序,问题就会消失。

最新更新