Jakie flagi ustawiasz dla debuggera / kompilatora GFORTRAN, aby wyłapać wadliwy kod?

Myślę, że nie znajdę tego w żadnym podręczniku, ponieważ odpowiedź na to wymaga doświadczenia. Obecnie jestem na etapie testowania / walidacji mojego kodu / polowania na błędy, aby wprowadzić go do stanu produkcyjnego i wszelkie błędy doprowadziłyby do wielu osób cierpiących np. na ciemną stronę.

  • Jakie flagi ustawiasz podczas kompilacji programu dla Fortran do celów debugowania?

  • Jakie flagi ustawiacie dla systemu produkcyjnego?

  • Co ty zrobić, zanim wyruszysz?

Wersja produkcyjna używa ifort jako kompilatora, jednak ja testuję z gfortran. Źle to robię?

Author: Alexander Vogt, 2010-09-09

2 answers

Bare minimum


-Og/-O0

-O0 zasadniczo mówi kompilatorowi, aby nie dokonywał optymalizacji. Optymalizator może usunąć niektóre zmienne lokalne, scalić niektóre bloki kodu itp. w rezultacie debugowanie może być nieprzewidywalne. Cena opcji -O0 to bardzo powolne wykonywanie kodu , ale począwszy od wersji 4.8 Kompilatory GCC (w tym Fortran) akceptują nowo wprowadzony poziom optymalizacji -Og:

-Og

Zoptymalizuj środowisko debugowania. -Og umożliwia optymalizacje, które nie zakłócają debugowania. Powinien to być wybrany poziom optymalizacji dla standardowego cyklu edycji-kompilacji-debugowania, oferujący rozsądny poziom optymalizacji przy zachowaniu szybkiej kompilacji i dobrego debugowania.

Tak więc, jeśli to możliwe, użyj -Og, w przeciwnym razie użyj -O0.


-g

Ta opcja umożliwia debugowanie poprzez żądanie kompilatora, aby wytworzył informacje debugujące przeznaczone do użycia przez interaktywny debugger (GDB).


Additional

Jest ich mnóstwo. Najbardziej przydatne moim zdaniem są:

-Wall aby " włączyć wszystkie ostrzeżenia o konstrukcjach, które niektórzy użytkownicy uważają za wątpliwe i które są łatwe do uniknięcia (lub zmodyfikowania, aby zapobiec ostrzeżeniu), nawet w połączeniu z makrami."

-Wextra aby " włączyć dodatkowe flagi ostrzegawcze które nie są włączone przez ścianę."

-pedantic generowanie ostrzeżeń o funkcjach językowych, które są obsługiwane przez gfortran, ale nie są częścią oficjalnego standardu Fortran 95. Można być jeszcze bardziej "pedantycznym" i używać -std=f95 flaga, aby ostrzeżenia stały się błędami.

-fimplicit-none to " określa, że nie jest dozwolone typowanie niejawne, chyba że jest nadpisywane przez jawne niejawne instrukcje. Jest to odpowiednik dodawania implicit none na początku każdego procedura."

-fcheck=all aby "włączyć testy w czasie wykonywania", takie jak na przykład sprawdzanie granic tablic.

-fbacktrace aby " określić, że w przypadku napotkania błędu uruchomieniowego lub wyemitowania śmiercionośnego sygnału (błąd segmentacji, nielegalna instrukcja, błąd magistrali lub wyjątek zmiennoprzecinkowy) Biblioteka uruchomieniowa Fortran powinna wyświetlać ślad błędu."

 50
Author: Wildcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-23 21:18:07

Do debugowania używam: -O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsurprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck=all -std=f2008 -pedantic -fbacktrace. Dla tych, które jeszcze nie zostały wyjaśnione, sprawdź instrukcję gfortran. -fcheck=all obejmuje -fcheck=bounds.

Do produkcji używam: -O3 -march=native -fimplicit-none -Wall -Wline-truncation -fwhole-file -std=f2008. Kontrole Runtime, takie jak sprawdzanie granic, wydłużają czas wykonania wynikowego pliku wykonywalnego. Uważam, że koszt często jest zaskakująco niski, ale może być wysoki. W związku z tym nie ma kontroli runtime kompilacji dla produkcji.

 15
Author: M. S. B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 00:44:45