使用方法
- 环境变量配置
浮点异常检测的打印信息和检测项通过环境变量配置
- 打印信息通过NAN_REPORT_CONFIG环境变量配置:
error/warning:error配置遇到异常直接exit;warning配置遇到异常仅告警,并继续往下执行;
detail/brief:detail配置打印详细的堆栈信息,解析文件名和行号;brief配置仅打印堆栈中内存地址,不做解析。
配置举例:export NAN_REPORT_CONFIG=error+detail。
- 检测项通过NAN_EXCEPT_CONFIG环境变量配置:
默认配置打开除FE_INEXACT外所有异常(0x0000000F),用户可以根据上述每个异常对应的bitmap配置。
配置举例:export NAN_EXCEPT_CONFIG=0x00000003,仅检测FE_INVALID和FE_DIVBYZERO异常。
- 打印信息通过NAN_REPORT_CONFIG环境变量配置:
- 编译选项
- Fortran应用:编译增加选项-fp-detect-exceptions -g;
- C/C++应用:编译增加选项-finstrument-functions -lfpe -g;
- 支持仅对用户指定的函数进行检测,排查某个位置前是否出现NAN,编译选项-lfpe -g,同时在需检测的位置调用fpe_nan_check()。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//main.cpp #include <iostream> void foo() { float x = 1; float y = 0; float z = x/y; std::cout << "divide_by_zero: 1/0 =" << z << std::endl; } int main() { foo(); return 0; }
编译命令及结果:
1 2 3 4 5 6 7 8 9
$ export NAN_REPORT_CONFIG=error+detail $ clang++ -finstrument-functions -lfpe main.cpp -o a.out -g $ ./a.out divide_by_zero: 1/0 =inf Warning: ieee_divide_by_zero is signaling ##################backtrace################### ./a.out(+0xbd0) [0xaaaab69fbbd0] foo() ../main.cpp:8 ./a.out(+0xc34) [0xaaaab69fbc34] main ../main.cpp:11 ##############################################
- 补充说明
打印的堆栈源码行号可能出现向下偏移一行,原因是底层库函数backtrace解析时返回的是下一条汇编指令地址,该指令可能来自当前源码行,也可能来自下一行,根据打印结果需确认下是否存在偏移的情况。
父主题: 浮点异常检测