Почему не возникает исключение с плавающей запятой (FPE)?

Я пытаюсь поймать некоторый FPE в коде Fortran, но, похоже, он не работает в каждой среде.

В качестве примера я написал следующий код:

program test
    implicit none

    doubleprecision, dimension(1) :: x  ! used to lure the compiler

    x(1) = 1d0

    print *, 'start'
    print *, 1d0 / (1d0 - x(1))
    print *, 'end'
end program test

Одна из моих машин (1) использует CentOS 7.6.1810, gfortran 4.8.5 и имеет Intel Xenon в качестве процессора. Другой (2) использует Debian 10 Buster (на самом деле это в Windows 10, но я использую приложение Debian для WSL), gfortran 9.2.0 и имеет Intel Core i5 в качестве процессора.

Когда я компилирую приведенный выше код, используя

gfortran -o test -ffpe-trap=zero -fbacktrace -g -Og test.f90

на машине 1 и выполнить код, я получаю то, что ожидаю, т.е.

$ ./test
start

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.

Backtrace for this error:
#0  0x7F2374BEC697
#1  0x7F2374BECCDE
#2  0x7F23740E827F
#3  0x400858 in MAIN__ at test.f90:9

Однако, когда я делаю то же самое на машине 2, я получаю только:

$ ./test
start

Почему ? И что мне делать, чтобы получить сообщение об ошибке SIGFPE (и другие сигналы) на машине 2?


person Thelxinoe Tessarákontadyo    schedule 29.11.2019    source источник
comment
Добро пожаловать, я предлагаю совершить тур. Пожалуйста, используйте тег fortran для всех вопросов по Fortran. Я поймал это с помощью GCC 9.21 OpenSUSE 15.0. Может WSL виноват?   -  person Vladimir F    schedule 29.11.2019
comment
Связанный? github.com/microsoft/WSL/issues/3657   -  person Vladimir F    schedule 29.11.2019
comment
Кажется, вам нужно спросить Microsoft, как она справляется с плавающими исключениями в WSL. Я подозреваю, что вам нужно познакомиться с внутренним модулем IEEE_ARITHMETIC.   -  person evets    schedule 29.11.2019
comment
Хотя вы не видите сообщения об ошибке, похоже, что все еще происходит прерывание. Тебя волнует сообщение?   -  person francescalus    schedule 29.11.2019
comment
@VladimirF и evets Спасибо. Кажется, это действительно связано с WSL. По-видимому, это старая проблема, которую можно решить с помощью WSL 2 github.com/microsoft. /WSL/issues/1262#issuecomment-546831730. Я действительно не хочу присоединяться к программе предварительной оценки Windows, поэтому пока не могу проверить, действительно ли это решает мою проблему.   -  person Thelxinoe Tessarákontadyo    schedule 01.12.2019
comment
@francescalus Да, меня волнует сообщение. У меня есть такая проблема с очень сложным кодом, и когда программа просто останавливается без указаний на то, где произошла ошибка, значительно усложняет отладку.   -  person Thelxinoe Tessarákontadyo    schedule 01.12.2019


Ответы (1)


Установка WSL 2 решила проблему.

$ ./test
start

Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.

Backtrace for this error:
#0  0x7feab2aee8b0 in ???
#1  0x7feab2aedae3 in ???
#2  0x7feab276883f in ???
        at /build/glibc-vjB4T1/glibc-2.28/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0
#3  0x4011fb in test
        at /home/user/test/test.f90:9
#4  0x401299 in main
        at /home/user/test/test.f90:11
Floating point exception
person Thelxinoe Tessarákontadyo    schedule 25.06.2020