2012-04-22 28 views
7

He compilado un código Fortran, que contiene varios módulos, utilizando tanto gfortran 4.4 como intel 11.1 y posteriormente intenté depurarlo usando tanto gdb como DDT. En todos los casos, no puedo ver los valores de las variables que se declaran en los módulos. Estas variables globales tienen valores, ya que el código aún se ejecuta correctamente, pero no puedo ver cuáles son los valores en mis depuradores. Las variables locales están bien. He tenido problemas para encontrar una solución a este problema en otro lugar en línea, por lo que quizás no haya una solución directa, pero será muy difícil depurar mi código si no puedo ver los valores de cualquiera de mis variables globales.Variables del módulo Fortran no accesibles en los depuradores

+0

¿Está compilando con banderas -O0 y -G? –

+0

He visto esto, y lo que hice fue encerrar las variables en un tipo de usuario y mantener un registro global (guardado). Luego accedes en el depurador con% (ejemplo OT% POINT_COUNT cuando OT contiene mis gobals) – ja72

+1

Para Nick Atoms, compilar con -O0 fue el truco, pero solo para elementos que no son de matriz. Leí que la optimización puede hacer que las variables globales no sean accesibles, pero pensé que si no se usaban indicadores de optimización, entonces el compilador no optimizaba por defecto. Aparentemente, estaba equivocado. Sin embargo, todavía no puedo acceder a ninguna información en mis matrices globales. Una vez más, están siendo leídos y asignados correctamente, pero no puedo imprimir toda la matriz o cualquier elemento individual en la matriz en el depurador. – rks171

Respuesta

3

En GDB, intentan hacer referencia a las variables globales con nombres como __ modulename __ nombredevariable

se puede comprobar que este es el derecho mangling esquema usando nm y grep para encontrar una de las variables globales en el símbolos de tu programa.

Si eso no funciona, asegúrese de estar utilizando una versión reciente de gdb.

Aquí hay un hilo sobre este tema: http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html

+1

Esto funciona para mostrar elementos que no son de matriz, además de compilar con -O0. Puedo imprimir variables globales, pero aún no puedo ver los valores de las matrices globales. Cuando trato de imprimir el nombre de la matriz como __modulename_MOD_arrayname, se devuelve un número grande aparentemente aleatorio. Si trato de imprimir un elemento de la matriz, obtengo -nan (0xf ...). ¿Alguna idea de cómo hacer que las matrices se impriman correctamente, así como las variables que no son de matriz? – rks171

+1

Solo para observar mi progreso, intenté construir con intel 11.1 (con -O0 esta vez) y depuración con gdb, y todas las variables globales y matrices globales se imprimen correctamente. Intenté compilar con g95 y depurar con gdb y las variables globales no se imprimirán incluso cuando estén compiladas con -O0 (tengo que usar la convención de nomenclatura enumerada arriba para obtenerlas). Pero las matrices globales todavía no se imprimen. Entonces, en resumen, parece que es un problema con gfortran y g95 y no con gdb. Y construir con intel 11.1 funciona bien. – rks171

4

Con los nuevos GDBS (7.2 si no recuerdo mal), módulos de depuración es simple. Tome el siguiente programa:

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

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

Ahora puede ejecutar:

$ 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

Debe funcionar con gdb 7.2 porque tengo 7.1 instalado en mi sistema y escribir "p modname :: var" todavía da como resultado "Sin símbolo en el contexto actual". Sin embargo, tenga en cuenta que todo este problema parece ser un problema de gfortran y no de gdb, ya que cuando construí mi código fuente con intel ifort 11.1, gdb no tuvo problemas para imprimir una variable o matriz local o global.La construcción sin optimización con gfortran permitió la impresión de variables globales, pero aún no las matrices globales. – rks171

Cuestiones relacionadas