使用方法

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解析时返回的是下一条汇编指令地址,该指令可能来自当前源码行,也可能来自下一行,根据打印结果需确认下是否存在偏移的情况。