Какие флаги вы устанавливаете для своего отладчика / компилятора GFORTRAN для отлова неисправного кода? - PullRequest
36 голосов
/ 09 сентября 2010

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

  • Какие флаги вы устанавливаете, когда компилируете свою программу для Fortran для целей отладки?

  • Какие флаги вы устанавливаете для производственной системы?

  • Что вы делаете перед развертыванием?

В рабочей версии в качестве компилятора используется ifort, но я провожу тестирование с gfortran. Я делаю это неправильно?

Ответы [ 2 ]

51 голосов
/ 12 сентября 2010

Голый минимум


-Og / -O0

-O0 в основном говорит компилятору не делать оптимизаций. Оптимизатор может удалить некоторые локальные переменные, объединить несколько блоков кода и т. Д., И в результате он может сделать отладку непредсказуемой. Цена за опцию -O0 составляет очень медленное выполнение кода , но начиная с версии 4.8 компиляторы GCC (включая Fortran) принимают недавно введенный уровень оптимизации -Og:

-OG

Оптимизация опыта отладки. -Og включает оптимизации, которые не мешают отладке. Этот уровень оптимизации должен быть выбран для стандартного цикла редактирования-компиляции-отладки, предлагая разумный уровень оптимизации при одновременной поддержке быстрой компиляции и хорошем отладочном опыте.

Итак, если возможно, используйте -Og, в противном случае используйте -O0.


-g

Эта опция фактически делает возможной отладку, запрашивая у компилятора информацию об отладке, предназначенную для использования интерактивным отладчиком (GDB).


Addititonal

Их много. Наиболее полезными на мой взгляд являются:

-Wall, чтобы "включить все предупреждения о конструкциях, которые некоторые пользователи считают сомнительными и которые легко избежать (или изменить, чтобы предотвратить предупреждение), даже в сочетании с макросами."

-Wextra, чтобы «включить некоторые дополнительные флаги предупреждений, которые не включены -Wall.»

-pedantic для создания предупреждений о языковых функциях, которые поддерживаются gfortran, но не являются частью официального стандарта Fortran 95. Можно быть еще более «педантичным» и использовать флаг -std=f95, чтобы предупреждения стали ошибками.

-fimplicit-none, чтобы "указать, что неявная типизация не допускается, если только она не переопределена явными операторами IMPLICIT. Это эквивалентно добавлению неявного none к началу каждой процедуры."

-fcheck=all для «включения тестов во время выполнения», таких как, например, проверки границ массива.

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

15 голосов
/ 09 августа 2013

Для отладки я использую: -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace. Для тех, кто еще не объяснил, проверьте руководство gfortran. -fcheck=all включает -fcheck=bounds.

Для производства использую: -O3 -march=native -fimplicit-none -Wall -Wline-truncation -fwhole-file -std=f2008. Проверки времени выполнения, такие как проверка границ, увеличивают время выполнения результирующего исполняемого файла. Я обнаружил, что стоимость часто бывает удивительно низкой, но она может быть высокой. Следовательно, нет никаких проверок во время выполнения на компиляциях для производства.

...