如何在Windows 8上调试Double.TryParse中的偶发崩溃?

时间:2012-10-03 12:43:27

标签: .net windows-8 com-interop delphi-prism oxygene

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

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

我在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次之后突然开始工作。

3 个答案:

答案 0 :(得分:1)

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

您是否真的安装了.Net 3.5运行时?运行真正的.Net 3.5运行时和在.NET 4.0(预装Windows 8)下“模拟”它之间存在一些差异。

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

Force an application to run under specific .NET runtime version?

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

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

由于只有当.NET代码在Delphi .NET主机下运行时才会发生这种情况,我会看看你是否通过.NET AppDomain对Delphi进行了任何控制。我不是Delphi开发人员所以我在这里无法帮助你,但看起来有一个名为JCL的库可以让你更好地控制代码加载到AppDomain的方式。

Hosting the .NET runtime in a Delphi Program

如果您能够对此进行跟踪,我建议您与Microsoft支持人员分享您的发现,以便他们可以解决这个问题(假设他们可以解决这个问题)。

答案 1 :(得分:0)

Delphi更改了.NET不允许的CPU位数。它会抛出某种溢出的异常。从Delphi方面尝试类似的东西:

var lSave: Word;


lSave := Get8087CW;

Set8087CW($037f);

<YOURCALLTO.NET>

Set8087CW(lSave);

答案 2 :(得分:0)

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