我从一个用户那里收到了一个来自MadExcept的崩溃报告。异常是无效的浮点运算。
奇怪的是,callstack会在@FSafeDivide处终止。
我做了一个谷歌搜索,发现这是对某些奔腾芯片的检查,这些芯片没有正确地做除法运算。如果测试失败,所有的划分都将在软件而不是硬件中完成。我在编译器设置中打开了Pentium-Safe FDIV选项。
这可能是导致错误的原因吗?我还在其他地方读到EInvalidOp是一个异常类,可能是堆栈溢出或其他什么。
以下是mad的一个片段,除非你想阅读它。
异常类: 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
发布于 2010-09-10 07:33:20
首先,除非确实有人仍然在早期的Pentium i芯片上运行,否则您可能应该关闭编译器选项。它是为了解决一些特定CPU中的小故障,自1995年以来销售的任何芯片都没有出现过这个问题。
话虽如此,如果你在除法中有一个无效的浮点操作,问题很可能出在你的代码中的某个地方,特别是因为FSafeDivide是应该产生正确结果的例程。看一下TMyBossThread.Search的第317行,看看它在那里划分了什么。还要看看第316行,因为堆栈跟踪有时会将您指向您所关心的那行之后的行。
发布于 2010-09-10 08:41:03
在草堆中搜索之前,有几点评论:
最后两个问题指的是FPU寄存器混乱的问题:
在这里查看interoping with .Net和Help on Set8087CW for OpenGL中的内容
发布于 2012-06-22 21:52:51
这篇(德语)文章描述了打开奔腾(Tm)-safe divide ($U+)修复Windows2003Server系统上的数据执行保护错误的情况,该系统启用了DEP:
http://entwickler-forum.de/archive/index.php/t-41207.html
Delphi2009仍然有这个编译器标志,默认的$U- (没有奔腾(Tm)-safe除法。
因此,即使我们可以忘记与硬件相关的部分(坏掉的CPU),它仍然可以根据操作系统的功能(如DEP )而有所不同
https://stackoverflow.com/questions/3681244
复制相似问题