2015-04-23 34 views
10

Sto eseguendo il debug di un programma numerico più grande a cui ho aggiunto. È scritto in fortran90, compilato con gfortran (l'ultima versione disponibile per Mac) e sto eseguendo il debug usando gdb (di nuovo l'ultima versione disponibile per Mac).Debugging con gdb e gfortran - FPE

Le mie aggiunte hanno un bug da qualche parte e sto cercando di individuarlo, il che è chiaro come l'esecuzione del programma non produce il risultato atteso. Quando corro in gdb, ottengo il seguente output alla fine:

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]

Vorrei identificare esattamente dove si verifica questo FPE, ma sembra che un'eccezione virgola mobile non provoca la programma in crash. Ho provato questo dividendo esplicitamente per 0 nel mio codice - non ha causato il blocco del programma, ma ha portato a comportamenti imprevisti.

Qual è il flag corretto per gdb o gfortran per garantire che il programma smetta di funzionare (idealmente con un backtrace) quando raggiunge un'eccezione a virgola mobile? Ho provato a seguire le istruzioni here ma non sembra cambiare nulla.

+1

Non ci sono flag di compilazione di cui https://stackoverflow.com/questions/10210759/gfortran-warn-on-floating -point-eccezione che può aiutare. Tuttavia, potresti per favore menzionare i numeri di versione nella domanda? "L'ultima" sarà di minore utilità per i lettori in futuro. – francescalus

risposta

11

Probabilmente è necessario aggiungere queste bandiere durante la compilazione il codice:

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



Spiegazione per i flag di compilazione da manuale gfortran:

-g  

per includere dati di debug

-fbacktrace 

Specificare che, quando un si verifica un errore di runtime o viene emesso un segnale mortale (errore di segmentazione, istruzione non valida, errore del bus o eccezione a virgola mobile), la libreria di runtime Fortran deve generare un backtrace dell'errore. Questa opzione ha solo influenza sulla compilazione del programma principale Fortran.

-ffpe-trap=list 

Specificare un elenco di eccezioni IEEE quando deve essere sollevata un'eccezione a virgola mobile (FPE). Sulla maggior parte dei sistemi, ciò comporta l'invio di un segnale SIGFPE e l'interruzione del programma, producendo un file core utile per il debug. elenco è un elenco (eventualmente vuoto) separato da virgole delle seguenti eccezioni IEEE: 'non valido' (operazione in virgola mobile non valida, come SQRT (-1.0)), zero (divisione per zero), overflow (overflow in un floating punto operativo), underflow (underflow in un'operazione in virgola mobile), precision (perdita di precisione durante il funzionamento) e denormal (l'operazione ha prodotto un valore denormale). È probabile che alcune delle routine nella libreria di runtime Fortran, come "CPU_TIME", generino eccezioni in virgola mobile quando viene utilizzato ffpe-trap = precision. Per questo motivo, l'uso di ffpe-trap = precision non è raccomandato.

Date un'occhiata a questi due posti per ulteriori informazioni:

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

+0

Grazie mille amico. –