开发者
Rate This Document
Findability
Accuracy
Completeness
Readability
在线提单
论坛求助

使用方法

  1. 环境变量配置

    浮点异常检测的打印信息和检测项通过环境变量配置

    • 打印信息通过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异常。

  1. 编译选项
    • 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
    ##############################################
    
  2. 补充说明

    打印的堆栈源码行号可能出现向下偏移一行,原因是底层库函数backtrace解析时返回的是下一条汇编指令地址,该指令可能来自当前源码行,也可能来自下一行,根据打印结果需确认下是否存在偏移的情况。