3

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

奇怪的是,调用堆栈在@FSafeDivide 处死掉了。

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

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

如果您想阅读它,这里有一个 mad except 消息的片段。

异常类: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
4

3 回答 3

3

首先,除非您实际上还有人在早期的 Pentium I 芯片上运行,否则您可能应该关闭该编译器选项。这是为了解决一些特定 CPU 的故障,自 1995 年以来销售的任何芯片都没有出现过问题。

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

于 2010-09-09T23:33:20.320 回答
1

这篇(德语)文章描述了在启用了 DEP 的 Windows 2003 Server 系统上打开 Pentium(tm) 安全分隔 ($U+) 修复了数据执行保护错误的情况:

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

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

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

于 2012-06-22T13:52:50.580 回答
1

几条评论,在大海捞针之前:

  • “如果它不可重现,那就不是错误,而是异常”。不要把时间浪费在什么或为什么上,而要花在如何重新创造它上。
  • 正如 Mason 所说,可能是时候删除这个编译器选项了。(D6快10岁了)
  • 你知道它是否发生在特定的 Windows 版本上吗?例如,在 XP 上运行良好的 Text-To-Speech 在 Vista 及更高版本上提供了“零错误的浮点除法”。
  • 假设您的代码看起来不错,那么会涉及一些浮点运算的所谓内容是什么?

最后两个是指 FPU 寄存器被弄乱的问题:
See here for interoping with .Net and in the Help on Set8087CW for OpenGL

于 2010-09-10T00:41:03.340 回答