2012-04-22 16 views
7

Ho compilato un codice Fortran, che contiene diversi moduli, utilizzando sia gfortran 4.4 che intel 11.1 e successivamente ho provato a eseguirne il debug utilizzando sia gdb che DDT. In tutti i casi, non riesco a vedere i valori di alcuna variabile dichiarata nei moduli. Queste variabili globali hanno valori, poiché il codice viene eseguito correttamente, ma non riesco a vedere quali sono i valori nei miei debugger. Le variabili locali vanno bene. Ho avuto difficoltà a trovare una soluzione a questo problema altrove online, quindi forse non c'è una soluzione semplice, ma sarà davvero difficile eseguire il debug del mio codice se non riesco a vedere i valori di nessuna delle mie variabili globali.Variabili del modulo Fortran non accessibili nei debugger

+0

Stai compilazione con le bandiere -O0 e -G? –

+0

Ho visto questo e quello che ho fatto è stato racchiudere le variabili in un tipo di utente e mantenere un record globale (salvato). Quindi accedi al debugger con% (esempio OT% POINT_COUNT quando OT contiene i miei gobal) – ja72

+1

Per Nick Atoms, la compilazione con -O0 ha fatto il trucco, ma solo per gli elementi non di array. Ho letto che l'ottimizzazione può far sì che le variabili globali non siano accessibili, ma ho pensato che se non sono stati utilizzati flag di ottimizzazione, il compilatore non ha eseguito alcuna ottimizzazione per impostazione predefinita. Apparentemente, ho sbagliato. Tuttavia, non riesco ancora ad accedere a nessuna informazione nei miei array globali. Ancora, vengono letti e assegnati correttamente i valori, ma non riesco a stampare l'intero array o singoli elementi dell'array nel debugger. – rks171

risposta

3

In gdb, provare riferimento le variabili globali con nomi come __ modulename __ variablename

è possibile verificare che questa sia la giusta pressare schema utilizzando nm e grep per trovare uno dei tuoi variabili globali nel simboli del tuo programma.

Se ciò non funziona, assicurati di utilizzare una versione recente di gdb.

Ecco un thread su questo tema: http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

+1

Questo funziona per visualizzare gli elementi non-array oltre alla compilazione con -O0. Posso stampare variabili globali, ma non riesco ancora a vedere i valori degli array globali. Quando provo a stampare il nome dell'array come __modulename_MOD_arrayname, viene restituito un numero grande apparentemente casuale. Se provo a stampare un elemento dell'array, ottengo -nan (0xf ...). Qualche idea su come ottenere array per stampare correttamente e variabili non array? – rks171

+1

Giusto per notare i miei progressi, ho provato a creare con intel 11.1 (con -O0 questa volta) e debugging con gdb, e tutte le variabili globali e gli array globali vengono stampati correttamente. Ho provato a costruire con g95 e il debugging con gdb e le variabili globali non verranno stampate anche se compilate con -O0 (devo usare la convenzione di denominazione sopra elencata per ottenerle). Ma gli array globali non vengono ancora stampati. Quindi, in sintesi, sembra che si tratti di un problema con gfortran e g95 e non con gdb. E costruire con Intel 11.1 funziona bene. – rks171

4

Con GDB più recenti (7.2 se non ricordo male), i moduli di debug è semplice. Prendere il seguente programma:

module modname 
    integer :: var1 = 1 , var2 = 2 
end module modname 

use modname, only: newvar => var2 
newvar = 7 
end 

È ora possibile eseguire:

$ gfortran -g -o mytest test.f90; gdb --quiet ./mytest 
Reading symbols from /dev/shm/mytest...done. 
(gdb) b 6 
Breakpoint 1 at 0x4006a0: file test.f90, line 6. 
(gdb) run 
Starting program: /dev/shm/mytest 
Breakpoint 1, MAIN__() at test.f90:6 
6  newvar = 7 
(gdb) p newvar 
$1 = 2 
(gdb) p var1 
No symbol "var1" in current context. 
(gdb) p modname::var1 
$2 = 1 
(gdb) p modname::var2 
$3 = 2 
(gdb) n 
7  end 
(gdb) p modname::var2 
$4 = 7 
(gdb) 
+1

Deve essere gdb 7.2 che funzioni perché ho installato 7.1 sul mio sistema e digitando "p modname :: var" risulta ancora "Nessun simbolo nel contesto corrente". Tuttavia, si noti che questo intero problema sembra essere un problema di gfortran e non un problema di gdb, come quando ho creato il mio codice sorgente con intel ifort 11.1, gdb non ha avuto alcun problema nella stampa di una variabile o array locale o globale.Costruire senza ottimizzazione con gfortran ha permesso di stampare variabili globali ma non ancora array globali. – rks171

Problemi correlati