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
Respuesta
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
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
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
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)
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
- 1. Variables no inicializadas en Fortran 2003
- 2. ¿Cómo se utilizan datos del módulo Fortran 90?
- 3. CMAKE: Imprime todas las variables accesibles en un script
- 4. Terminología del compilador de Fortran: Variables ficticias y atributos
- 5. Depuradores paralelos
- 6. ¿Sockets de dominio UNIX no accesibles entre los usuarios?
- 7. ¿Hay depuradores gramaticales Yacc?
- 8. GDB Vs Depuradores LLDB
- 9. ¿Las variables locales en Fortran 77 son estáticas o dinámicas?
- 10. exponer variables privadas en el diseño del módulo Revelar
- 11. Subrutinas puras en Fortran - Optimización del compilador
- 12. La misteriosa naturaleza de los módulos Fortran 90
- 13. fortran GUARDAR declaración
- 14. Configurar cookies accesibles desde el lado del cliente en Express
- 15. Extensión de un módulo Ruby en otro módulo, incluidos los métodos del módulo
- 16. Estructurando un módulo NodeJS - variables y métodos
- 17. Las clases que residen en App_Code no son accesibles
- 18. ¿Funcionalidad del tipo de autodocumentación para Fortran?
- 19. Accediendo a los métodos del módulo con ::
- 20. ¿Por qué algunos objetos no son accesibles desde diferentes subprocesos?
- 21. Dormir en Fortran
- 22. C++ Error CLI C3767: funciones candidatas no accesibles
- 23. ¿Qué significa "%" en Fortran?
- 24. ¿Por qué las clases internas hacen accesibles los métodos privados?
- 25. ¿Existen convenciones para los comentarios del módulo Python?
- 26. Imprimir todas las variables locales accesibles al ámbito actual en Lua
- 27. accediendo a los vars del "módulo de alcance"
- 28. Función privada en Fortran
- 29. Iniciales del módulo en C#
- 30. ¿El módulo Parallel :: ForkManager() admite la sincronización en variables globales?
¿Está compilando con banderas -O0 y -G? –
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
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