在不更改代码的情况下生成 NaN 浮点数时停止调试器
Stopping the debugger when a NaN floating point number is produced without a code change
我读了this and this。精髓是,如果通过包含 fenv.h 并通过 feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
启用所有浮点异常但 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 version 15.0.3编译器。
无论您的代码跨越多少个文件,您只需在 main()
函数的第一行添加 feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT)
一次 即可。
它将为您的整个程序启用异常,直到您通过调用另一个函数(例如 fedisableexcept()
.
来禁用异常为止
我读了this and this。精髓是,如果通过包含 fenv.h 并通过 feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
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 version 15.0.3编译器。
无论您的代码跨越多少个文件,您只需在 main()
函数的第一行添加 feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT)
一次 即可。
它将为您的整个程序启用异常,直到您通过调用另一个函数(例如 fedisableexcept()
.