2017-07-06 5 views
0

J'ai pris le conseil qui est donné dans les commentaires de cette question Gfortran does not tell me what sort of FPE it is, c'est-à-dire démarrer GDB, définir un point d'arrêt sur cette ligne et inspecter les valeurs de l'opération. Au début, mon programme est basé sur le code Fortran 77 (j'ai l'intention de le migrer vers F90 après avoir exécuté ce "test case" un test de données CFD idéaliste) et utilise les bibliothèques partagées NetCDF sur Ubuntu 16.04 LTS. J'utilise le compilateur gfortran 4.8.5 (peut passer à 5.x si nécessaire).Impossible d'extraire dans GDB les valeurs où FPE se produit

Voici comment le programme est compilé

gfortran -Wall -O0 -c -g -fbacktrace -ffpe-trap=invalid,denormal,zero,overflow,underflow ${tool}.f ${ncdf_incs} 

Maintenant, j'ai commencé gdb dans le répertoire où se trouve le programme et je tapais

break inv_cart.f:1221 

qui est l'endroit où la FPE se produit (un diviser par zéro erreur). Quand je fais ce que je reçois ce message -

Make breakpoint based on future shared library load (y/n) ? 

donc j'ai cherché SO pour ce problème et j'ai obtenu ceci précédemment Q/A - How to set breakpoints with shared libraries et c'est ce que je faisais

set breakpoint pending on 
break inv_cart.f:1221 

MISE À JOUR

J'ai eu un oubli. Après je cours pause, je reçois ce message d'erreur

No symbol table is loaded. Use the "file" command 
Breakpoint 1 (inv_cart.f:1221) is pending. 

FIN MISE À JOUR

Après que je fais cela, je reçois la même erreur que je suis quand je courais inv_cart au sein gdb ou autonome.

Program received signal SIGFPE - arithmetic exception 

suivi d'une adresse mémoire et de quelques points d'interrogation suivis de(). Donc, je quitte gdb et puis il me dit qu'il y a une session de débogage qui est toujours active.

Donc, ma question demeure - Comment obtenir les valeurs où le FPE se produit?

+1

Créer un point d'arrêt basé sur la future charge de bibliothèque partagée (y/n)? - Cela me suggère que l'instance GDB n'a pas une connaissance suffisante du code source pour savoir où placer le point de rupture, et donc, plutôt que de mettre en pause l'exécution de inv_cart.f: 1221, il continue à fonctionner (et par conséquent frapper votre FPE). Pourriez-vous fournir des informations supplémentaires sur les indicateurs de compilation que vous utilisez pour ce travail. Essayez de supprimer toute optimisation (-O #) et d'inclure le -g (EDIT - Lisez le Q lié, et voyez que vous avez déjà les bons indicateurs) - le problème de ne pas trouver src est toujours valide. – s8129

+0

@ s8129 - cette information sur la compilation a été ajoutée à la question. – gansub

+0

@ s8129 - Je ne sais pas comment les bibliothèques partagées NetCDF affectent ce problème. Le FPE et la bibliothèque partagée n'ont aucune connexion – gansub

Répondre

1

C'est un problème simple après la mise à jour a été remarquée par mes soins.

Je regardai cette question - gdb no symbol table is loaded et je suis allé de l'avant et a fait ce

file inv_cart 

et enfin la table de symbole a été chargé et à ma joie j'ai couru à nouveau le programme via gdb et a été en mesure d'imprimer la valeur de la partie du code où le FPE se produisait.