Delphi 6编译器选项(奔腾安全FDIV)

时间:2010-09-09 23:14:22

标签: delphi compiler-construction floating-point division

我收到了来自用户的MadExcept的崩溃报告。异常是无效的浮点运算。

奇怪的是,callstack在@FSafeDivide死了。

我做了谷歌,发现这是对某些没有正确划分的奔腾芯片的检查。如果测试失败,所有分区都将在软件而不是硬件中完成。我在编译器设置中打开了Pentium-Safe FDIV选项。

这会导致错误吗?我还在其他地方读到了作为异常类的EInvalidOp可能是堆栈溢出或其他什么。

如果你想阅读它,这里有疯狂的消息。

异常类:EInvalidOp 异常消息:无效的浮点操作。

thread $1014 (TMyBossThread):
00403509 M5b3.exe System                @FSafeDivide
008300c9 M5b3.exe MMyWorkerThread    317 TMyBossThread.Search
0073e87a M5b3.exe MMyManagerThread 186 TMyWorkerThread.Execute
008e8c17 M5b3.exe madExcept             HookedTThreadExecute
0042c150 M5b3.exe Classes               ThreadProc
00405354 M5b3.exe System                ThreadWrapper
008e8af9 M5b3.exe madExcept             CallThreadProcSafe
008e8b63 M5b3.exe madExcept             ThreadExceptFrame
created by main thread ($864) at:
0073e828 M5b3.exe MMyManagerThread 171 TMyManagerThread.Create

3 个答案:

答案 0 :(得分:2)

首先,除非你真的让人们仍在早期的Pentium I芯片上运行,否则你应该关掉那个编译器选项。这是为了解决几个特定CPU中的故障,自1995年以来销售的任何芯片都没有出现问题。

话虽如此,如果你在一个分区中有一个无效的浮点运算,问题最有可能出现在你的代码中,特别是因为FSafeDivide是应该产生正确结果的例程。看看TMyBossThread.Search,第317行,看看它在那里划分了什么。另请参阅第316行,因为堆栈跟踪有时可以指向您关注的那一行之后的行。

答案 1 :(得分:1)

在大海捞针之前发表一些评论:

  • “如果它不可再现,那不是错误而是异常”。不要在什么或为什么上浪费时间,而是在如何重新创建它。
  • 正如梅森所说,现在可能是删除此编译器选项的时候了。 (D6差不多10岁)
  • 您知道它是否发生在特定的Windows版本上?例如,在XP上运行良好的Text-To-Speech在Vista上提供了“浮点除零错误”。
  • 假设您的代码看起来很好,所谓的涉及一些浮点运算?

最后两个是指FPU寄存器混乱的问题:
请参阅此处查看interoping with .NetHelp on Set8087CW for OpenGL

答案 2 :(得分:1)

这篇(德国)文章介绍了在启用了DEP的Windows 2003 Server系统上启用Pentium(tm)-safe除法($ U +)修复数据执行保护错误的情况:

http://entwickler-forum.de/archive/index.php/t-41207.html

Delphi 2009仍然有这个编译器标志,默认为$ U-(没有Pentium(tm)-safe划分。

因此,即使我们可以忘记与硬件相关的部分(CPU损坏),它仍然会有所不同,具体取决于像DEP这样的操作系统“功能”