Отладка с помощью gdb и gfortran-FPE

Я отлаживаю большую числовую программу, к которой я добавил. Он написан на fortran90, скомпилирован с gfortran (последняя версия, доступная для Mac), и я отлаживаю его с помощью gdb (снова последняя версия, доступная для Mac).

мои дополнения имеют ошибку где-то, и я пытаюсь найти ее, что ясно, так как запуск программы не дает ожидаемого результата. Когда я запускаю его в gdb, я получаю следующий вывод на конец:

Note: The following floating-point exceptions are signalling: IEEE_INVALID_FLAG IEEE_DIVIDE_BY_ZERO IEEE_UNDERFLOW_FLAG IEEE_DENORMAL [Inferior 1 (process 83843) exited normally]

Я хотел бы определить точно здесь этот FPE происходит, но кажется, что исключение с плавающей запятой не вызывает сбоя программы. Я протестировал это, явно разделив на 0 в моем коде - это не заставило программу остановиться, но привело к неожиданному поведению.

каков правильный флаг для gdb или gfortran, чтобы гарантировать, что программа перестанет работать (в идеале с backtrace), когда она достигнет плавающей исключение? Я попытался следовать инструкциям здесь

1 ответов


наверное, вам нужно добавить эти флаги при компиляции кода:

gfortran -g -fbacktrace -ffpe-trap=zero,overflow,underflow youcode.f90 -o run.exe



Объяснение флагов компилятора из руководства gfortran:

-g       

включить отладочные данные

-fbacktrace

укажите, что при обнаружении ошибки времени выполнения или излучении смертельного сигнала (ошибка сегментации, незаконная инструкция, ошибка шины или исключение с плавающей запятой) библиотека времени выполнения Fortran должна выводить обратную трассировку ошибки. Только этот вариант оказывает влияние на составление основной программы Fortran.

-ffpe-trap=list

укажите список исключений IEEE при возникновении исключения с плавающей запятой (FPE). В большинстве систем это приведет к отправке сигнала SIGFPE и прерыванию программы, что приведет к созданию основного файла, полезного для отладки. список-это (возможно, пустой) разделенный запятыми список следующих исключений IEEE: "недопустимый" (недопустимая операция с плавающей запятой, такая как SQRT(-1.0)), zero (деление на ноль), overflow (переполнение в операции с плавающей запятой), underflow (переполнение в операции с плавающей запятой), precision (потеря точности во время работы) и denormal (операции, производимой значение Донормила). Некоторые из процедур в библиотеке времени выполнения Fortran, такие как "CPU_TIME", могут вызвать исключения с плавающей запятой при использовании ffpe-trap=precision. По этой причине использование ffpe-trap=precision не рекомендуется.

взгляните на эти два места для более info:

https://gcc.gnu.org/onlinedocs/gcc-4.3.2/gfortran.pdf http://faculty.washington.edu/rjl/uwamath583s11/sphinx/notes/html/gfortran_flags.html