web-dev-qa-db-fra.com

Débogage avec gdb et gfortran - FPE's

Je débogue un plus grand programme numérique auquel j'ai ajouté. Il est écrit en fortran90, compilé avec gfortran (la dernière version disponible pour Mac) et je le débogue en utilisant gdb (encore une fois la dernière version disponible pour Mac).

Mes ajouts ont un bug quelque part et j'essaie de le localiser, ce qui est clair car l'exécution du programme ne produit pas le résultat attendu. Lorsque je l'exécute dans gdb, j'obtiens la sortie suivante à la fin:

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]

Je voudrais identifier exactement ce FPE se produit, mais il semble qu'une exception à virgule flottante ne provoque pas le plantage du programme. J'ai testé cela en divisant explicitement par 0 dans mon code - cela n'a pas provoqué l'arrêt du programme, mais a conduit à un comportement inattendu.

Quel est l'indicateur approprié pour gdb ou gfortran pour garantir que le programme s'arrête (idéalement avec une trace arrière) lorsqu'il atteint une exception à virgule flottante? J'ai essayé de suivre les instructions ici mais cela ne semble rien changer.

13
The Wind-Up Bird

Vous devez probablement ajouter ces indicateurs lors de la compilation de votre code:

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



Explication des drapeaux du compilateur dans le manuel de gfortran:

-g       

inclure des données de débogage

-fbacktrace

Spécifiez que, lorsqu'une erreur d'exécution est rencontrée ou qu'un signal mortel est émis (erreur de segmentation, instruction illégale, erreur de bus ou exception à virgule flottante), la bibliothèque d'exécution Fortran doit générer une trace de l'erreur. Cette option n'a d'influence que pour la compilation du programme principal de Fortran.

-ffpe-trap=list

Spécifiez une liste d'exceptions IEEE lorsqu'une exception de virgule flottante (FPE) doit être levée. Sur la plupart des systèmes, cela entraînera l'envoi d'un signal SIGFPE et l'interruption du programme, produisant un fichier de base utile pour le débogage. list est une liste (éventuellement vide) séparée par des virgules des exceptions IEEE suivantes: invalid (opération à virgule flottante non valide, telle que SQRT (-1.0)), zero ( division par zéro), overflow (débordement dans une opération à virgule flottante), underflow (sous-dépassement dans une opération à virgule flottante), precision (perte de précision pendant le fonctionnement) et denormal (l'opération a produit une valeur dénormale). Certaines routines de la bibliothèque d'exécution Fortran, comme ‘CPU_TIME’, sont susceptibles de déclencher des exceptions à virgule flottante lorsque ffpe-trap = precision est utilisé. Pour cette raison, l'utilisation de ffpe-trap = precision n'est pas recommandée.

Jetez un oeil à ces deux endroits pour plus d'informations:

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

14
Bahman