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ę?
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."
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.
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