Отладка с помощью 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