2015-04-23 30 views
10

Debuguję większy program numeryczny, do którego dodałem. Jest napisany w fortran90, skompilowany z gfortran (najnowszą wersją dostępną dla Maca) i debuguję go za pomocą gdb (znowu najnowsza wersja dostępna dla Maca).Debugowanie za pomocą gdb i gfortran - FPE

Moje dodatki mają gdzieś błąd i próbuję go zlokalizować, co jest jasne, ponieważ uruchomienie programu nie przynosi oczekiwanego rezultatu. Kiedy uruchamiam go w gdb, otrzymuję następujący wynik na koniec:

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]

Chciałbym zidentyfikować dokładnie gdzie występuje to FPE, ale wydaje się, że zmiennoprzecinkowych wyjątek nie spowoduje program do awarii. Przetestowałem to przez wyraźne podzielenie przez 0 w moim kodzie - nie spowodowało to, że program przestał działać, ale doprowadził do nieoczekiwanego zachowania.

Jaka jest prawidłowa flaga dla gdb lub gfortran, aby upewnić się, że program przestaje działać (najlepiej ze śledzeniem wstecznym) po osiągnięciu wyjątku zmiennoprzecinkowego? Próbowałem postępować zgodnie z instrukcjami here, ale wydaje się, że nic nie zmienia.

+1

istnieją flagi kompilatora mowa w https://stackoverflow.com/questions/10210759/gfortran-warn-on-floating -point-wyjątek, który może pomóc. Czy mógłbyś jednak podać numery wersji w pytaniu? "Najnowsze" będzie mniej użyteczne dla czytelników w przyszłości. – francescalus

Odpowiedz

11

Prawdopodobnie trzeba dodać te flagi podczas kompilacji kodu:

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



objaśnienie flag kompilatora z gfortran instrukcji:

-g  

zawierać dane diagnostyczne

-fbacktrace 

Należy określić, kiedy pojawia się błąd w czasie wykonywania lub emitowany jest śmiercionośny sygnał (błąd segmentacji, niepoprawna instrukcja, błąd magistrali lub wyjątek zmiennoprzecinkowy), biblioteka wykonawcza Fortran powinna wyprowadzić ślad po błędzie. Ta opcja ma wpływ tylko na kompilację programu głównego Fortran.

-ffpe-trap=list 

Należy określić listę wyjątków IEEE, gdy powinien zostać podniesiony wyjątek zmiennoprzecinkowy (FPE). W większości systemów spowoduje to wysłanie sygnału SIGFPE i przerwanie programu, tworząc plik podstawowy przydatny do debugowania. lista jest (prawdopodobnie pustą) listą oddzielonych przecinkami następujących wyjątków IEEE: "nieprawidłowa" (nieprawidłowa operacja zmiennoprzecinkowa, taka jak SQRT (-1.0)), zero (dzielenie przez zero), overflow (przepełnienie w pływającym operacja punktowa), underflow (niedomiar w operacji zmiennoprzecinkowej), precision (utrata precyzji podczas działania) i denormal (operacja wytworzyła wartość denormalną). Niektóre z procedur w bibliotece środowiska wykonawczego Fortran, takie jak "CPU_TIME", mogą wywoływać wyjątki zmiennoprzecinkowe, gdy używana jest funkcja ffpe-trap = precision. Z tego powodu nie zaleca się stosowania pułapki ffpe = precyzja.

Spójrz na tych dwóch miejscach, aby uzyskać więcej informacji:

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

+0

Wielkie dzięki. –