Estoy tratando de usar mtrace
para detectar fugas de memoria en un programa fortran. Estoy usando el compilador de gfortran. Ver la entrada de Wikipedia para un ejemplo (de trabajo) C de mtrace: http://en.wikipedia.org/wiki/Mtracemtrace para un programa fortran
que probé en ambos sentidos, es decir, envolviendo el mtrace() y muntrace() y llamarlos desde el programa de Fortran, así como crear un programa en C, que directamente llame a mtrace() y muntrace(), además del código fortran que se está filtrando. Ambos enfoques no detectarán la pérdida de memoria, pero aquí presento solo el último.
example.c
#include <stdlib.h>
#include <mcheck.h>
extern void leaky_(); // this might be different on your system
// if it doesn't work, try to run:
// 1) gfortran leaky.f90 -c
// 2) nm leaky.o
// and then change this declaration and its use below
void main() {
mtrace();
leaky_();
muntrace();
}
leaky.f90
subroutine leaky()
real, allocatable, dimension(:) :: tmp
integer :: error
allocate (tmp(10), stat=error)
if (error /= 0) then
print*, "subroutine leaky could not allocate space for array tmp"
endif
tmp = 1
!of course the actual code makes more...
print*, ' subroutine leaky run '
return
end subroutine leaky
compilo con:
gfortran -g example.c leaky.f90
Luego ejecutar con:
export MALLOC_TRACE=`pwd`/raw.txt; ./a.out
Entonces analizar la salida raw.txt
mtrace
con:
mtrace a.out raw.txt
y obtener:
No hay pérdidas de memoria.
¿Hay algo que esté haciendo mal, o algo que pueda hacer para dejar que mtrace
encuentre la asignación de memoria forther permeable? Supongo que gfortran usa una llamada diferente malloc
, que mtrace
no rastrea ... De hecho, como escribí anteriormente, obtengo el mismo resultado si escribo un fortran principal que llamaría a (envuelto) mtrace()
y muntrace()
.
EDITADO: Consideré otras opciones (incluso algunas no mencionadas aún aquí), pero el código actual que se está depurando se ejecuta en P6/AIX, por lo que Valgrind sería "simplemente" inconveniente (debe ejecutarse en una máquina diferente), mientras que Forcheck sería inconveniente (necesita funcionar en una máquina diferente) y caro (~ 3k $). En la actualidad mtrace sería la mejor solución, si funcionó.
editado de nuevo: Mi conjetura
supongo gfortran utiliza una llamada
malloc
diferente, quemtrace
no rastrea ...
era correcta. Al mirar el ejecutable (ya sea con nm
o readelf
) no hay ninguna llamada malloc()
, pero _gfortran_allocate_array
- que tal vez llame a malloc). ¿Alguna otra idea?
editado de nuevo: he publicado la respuesta, pero no puedo aceptarlo (ir a http://stackoverflow.uservoice.com/pages/general/suggestions/39426 y solicitar la característica, es realmente necesario - no hay ganancia reputación quería)