2015-04-23 11 views
10

Ich bin Debuggen eines größeren numerischen Programms, das ich hinzugefügt habe. Es ist in fortran90 geschrieben, kompiliert mit gfortran (die neueste Version für Mac) und ich debugge es mit gdb (wieder die neueste Version für Mac).Debugging mit Gdb und Gfortran - FPE's

haben meine Ergänzungen einen Fehler irgendwo und ich versuche, es zu finden, die sich das Programm als Lauf klar ist das erwartete Ergebnis nicht produzieren. Wenn ich es in gdb laufen lasse, erhalte ich die folgende Ausgabe am Ende:

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]

Ich würde zu identifizieren, wie genau wo diese FPE auftritt, aber es scheint, dass eine Gleitkomma-Ausnahme verursacht nicht die Programm zum Absturz bringen. Ich habe dies getestet, indem ich in meinem Code explizit durch 0 geteilt habe - es hat nicht dazu geführt, dass das Programm nicht mehr lief, sondern zu unerwartetem Verhalten führte.

Was ist die richtige Flagge für entweder GDB oder gfortran, um sicherzustellen, dass das Programm nicht mehr läuft (im Idealfall mit einem Backtrace), wenn es eine Gleitkomma-Ausnahme erreicht? Ich habe versucht, den Anweisungen here zu folgen, aber es schien nichts zu ändern.

+1

Es gibt Compiler in https://stackoverflow.com/questions/10210759/gfortran-warn-on-floating genannten Flags -Punkt-Ausnahme, die helfen kann. Könnten Sie bitte die Versionsnummern in der Frage angeben? "Latest" wird den Lesern in Zukunft weniger nutzen. – francescalus

Antwort

11

Wahrscheinlich müssen Sie diese Flags hinzuzufügen, wenn Sie Ihren Code kompilieren:

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



Erklärung für Compiler-Flags aus gfortran Handbuch:

-g  

Debug-Daten enthalten

-fbacktrace 

Geben Sie Folgendes an, wenn a Laufzeitfehler aufgetreten ist oder ein tödliches Signal ausgegeben wird (Segmentierungsfehler, unzulässige Anweisung, Busfehler oder Gleitkommaausnahme), sollte die Fortran-Laufzeitbibliothek eine Rückverfolgung des Fehlers ausgeben. Diese Option hat nur Einfluss auf die Zusammenstellung des Fortran-Hauptprogramms.

-ffpe-trap=list 

Geben Sie eine Liste der IEEE-Ausnahmen an, wenn eine Gleitkommaausnahme (FPE) ausgelöst werden soll. Bei den meisten Systemen führt dies dazu, dass ein SIGFPE-Signal gesendet und das Programm unterbrochen wird, wodurch eine zum Debuggen nützliche Kerndatei erzeugt wird. Liste ist eine (möglicherweise leere) durch Kommata getrennte Liste der folgenden IEEE Ausnahmen: ‚ungültig‘ (invalid Gleitkommaoperation, wie SQRT (-1.0)), zero (Divi- sion durch Null), overflow (Überlauf in einem schwebenden Punktoperation), underflow (Unterlauf in einer Gleitkommaoperation), precision (Verlust der Genauigkeit während des Betriebs) und denormal (Operation erzeugte einen Denormalwert). Einige der Routinen in der Fortran-Laufzeitbibliothek, wie 'CPU_TIME', werden wahrscheinlich Gleitkommaausnahmen auslösen, wenn fppe-trap = precision verwendet wird. Aus diesem Grund wird die Verwendung von ffpe-trap = precision nicht empfohlen.

an diesen beiden Orten Schauen Sie für weitere Informationen:

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

+0

Vielen Dank Mann. –