Question

J'essaie d'utiliser mtrace pour détecter les fuites de mémoire dans un programme fortran. J'utilise le compilateur Gfortran. Voir l'entrée wikipedia pour un exemple (de travail) C de mtrace: http://en.wikipedia.org/ wiki / trace

J'ai essayé les deux méthodes, c'est-à-dire en enveloppant mtrace () et muntrace () et en les appelant à partir du programme fortran, ainsi que de créer un programme C appelant directement mtrace () et muntrace (), en plus du code fortran qui fuit. entre. Les deux approches ne détecteront pas la fuite de mémoire, mais je ne présente ici que la dernière.

exemple.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

Je compile avec:

gfortran -g example.c leaky.f90

Puis je cours avec:

export MALLOC_TRACE=`pwd`/raw.txt; ./a.out

Ensuite, j'analyse le raw.txt mtrace généré avec:

mtrace a.out raw.txt

et obtenez:

Pas de fuite de mémoire.

Y a-t-il quelque chose que je ne fais pas correctement ou que je puisse faire pour permettre à mtrace de trouver l'allocation de mémoire perdue pour le réseau? Je suppose que gfortran utilise un autre appel malloc , que mtrace ne trace pas ... En fait, comme je l’ai écrit ci-dessus, j’obtiens le même résultat si j’écris un script principal qui appelle le mtrace () et le muntrace () . >

MODIFIÉ: j’ai envisagé d’autres options (y compris certaines qui ne sont pas encore mentionnées ici), mais le code en cours de débogage s’exécute sur P6 / AIX, donc Valgrind serait "juste". gênant (il doit fonctionner sur une machine différente), alors que Forcheck serait gênant (il doit fonctionner sur une machine différente) et cher (~ 3k $). À l’heure actuelle, mtrace serait la meilleure solution si cela fonctionnait.

à nouveau édité: À mon avis

  

Je suppose que gfortran utilise un autre appel malloc , que mtrace ne trace pas ...

était correct. En examinant l'exécutable (avec nm ou readelf ), il n'y a pas d'appel malloc () , mais _gfortran_allocate_array ceux - qui appelleront peut-être malloc). D'autres idées?

à nouveau édité: J'ai posté la réponse mais je ne peux pas l'accepter (voir http: //stackoverflow.uservoice. com / pages / general / suggestions / 39426 et demandez la fonctionnalité, c'est vraiment nécessaire - aucun gain de réputation n'est recherché)

Était-ce utile?

La solution 3

Steve Kargl avait la réponse, qui est brièvement que mtrace ne trouve aucune fuite, car il n'y en a aucune si le compilateur est conforme à la norme: voir http://gcc.gnu.org/ml/fortran/2008-11/msg00163.html pour plus de détails.

En fait, je ne suis pas un grand spécialiste du fortran (je suis principalement du type C / C ++ / java), et j’utilisais également un autre compilateur, qui FUIT dans de telles conditions (je n’ai pas mentionné cela la question plus facile). J'ai donc pensé à tort que la fuite était là aussi avec gfortran, ce qui n'est pas le cas (j'ai vérifié avec top)

Autres conseils

Je ne suis pas un expert en mtrace, je ne peux donc pas m'en empêcher. Je vous suggère d'essayer l'outil valgrind pour rechercher les fuites de mémoire si vous utilisez un système pris en charge. Utiliser valgrind pour rechercher des fuites de mémoire est aussi simple que d'appeler valgrind --leak-check = full ./a.out.

Valgrind est uniquement sous Linux. Pour un produit Windows, regardez Forcheck. http://www.forcheck.nl/features.htm

J'ai de l'expérience dans le débogage des programmes Fortran, mais honnêtement, je ne comprenais pas vraiment votre question. Je pense que c'est parce que je n'ai pas beaucoup d'expérience de débogage C / C ++, ce qui est différent de Fortran. Néanmoins, je pense que cela vous sera bénéfique:

L'utilisation du compilateur Intel avec les options de compilation suivantes détectera presque toute fuite de mémoire, tout accès incorrect à une adresse ou l'utilisation d'un pointeur / d'une variable non initialisée pendant l'exécution.

intel: -O0 -debug -traceback -check -ftrapuv

Pour Gfortran, vous pouvez également obtenir l’une des erreurs ci-dessus avec ces options du compilateur.

gfortran: -g -O0 -fbounds-check -Wuninitialisé

Il imprimera le suivi des appels de sous-routines jusqu’à ce que l’erreur se produise. Il est toujours utile de compiler avec deux compilateurs différents et, d'après mon expérience, il ne restera pratiquement aucune fuite de mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top