1. 环境变量配置
浮点异常检测提供两个配置选项给用户选择,通过NAN_REPORT_CONFIG环境变量配置:
1)error/warning:error配置遇到异常直接exit;warning配置遇到异常仅告警,并继续往下执行;
2)detail/brief:detail配置打印详细的堆栈信息,解析文件名和行号;brief配置仅打印堆栈中内存地址,不做解析。
配置举例:export NAN_REPORT_CONFIG=error+detail。
2. 编译选项
1)Fortran应用:编译增加选项-fp-detect-exceptions -g;
2)C/C++应用:编译增加选项-finstrument-functions -lfpe -g;
3)支持仅对用户指定的函数进行检测,排查某个位置前是否出现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 ############################################## |
3. 补充说明
打印的堆栈源码行号可能出现向下偏移一行,原因是底层库函数backtrace解析时返回的是下一条汇编指令地址,该指令可能来自当前源码行,也可能来自下一行,根据打印结果需确认下是否存在偏移的情况。