【问题标题】:Stopping the debugger when a NaN floating point number is produced without a code change在生成 NaN 浮点数而不更改代码时停止调试器
【发布时间】:2018-02-20 13:36:14
【问题描述】:

我读过thisthis。精髓是,如果通过包含 fenv.h 并启用所有浮点异常但 FE_INEXACT feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT); 产生 nan,则可以抛出 SIGFPE

因此,代码改变了形式

int main () {
   double dirty = 0.0;
   double nanvalue = 0.0/dirty;
   return 0;
 }

 #include <fenv.h>
 int main () {
     feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);  // Enable all floating point exceptions but FE_INEXACT
     double dirty = 0.0;
     double nanvalue = 0.0/dirty;
     return 0;
 }

这很好用,但您必须更改代码。我有一个问题,在一个巨大的 c 和 c++ 代码库中,某处产生了一个 nan 而我不知道在哪里。不能将上述更改应用于大量文件和 跟踪错误。

有没有办法在不更改代码的情况下启用所有浮点异常?有没有我不知道的编译选项?

我们使用intel icc 15.0.3 版编译器。

【问题讨论】:

  • 您只需在main() 的第一行应用代码更改一次 对吗?
  • 我会试试的。我认为我需要在任何地方都包含它。
  • feenableexcept() 改变了运行时系统的行为,它只需要调用一次就可以全局生效。

标签: c++ c nan sigfpe


【解决方案1】:

无论您的代码跨越多少个文件,您只需在main() 函数的第一行添加feenableexcept(FE_ALL_EXCEPT &amp; ~FE_INEXACT)一次

它将为您的整个程序启用异常,直到您通过调用另一个函数(例如 fedisableexcept())来禁用异常。

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 2020-08-11
    • 2021-07-01
    • 2021-04-20
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多