Frage

Ich versuche mtrace zu verwenden Speicherlecks in einem Fortran-Programm zu erkennen. Ich verwende den gfortran Compiler. Siehe Wikipedia-Eintrag für ein (Arbeits-) C Beispiel mtrace: http://en.wikipedia.org/ wiki / MTRACE

habe ich versucht, in beide Richtungen, also das Einwickeln der mtrace () und muntrace () und aus dem Fortran-Programm aufrufen, sowie ein C-Programm erstellen, das die mtrace direkt () aufrufen und muntrace () neben dem undichten Fortran-Code zwischen. Beide Ansätze scheitern wird den Speicherverlust zu erkennen, aber ich hier präsentiert nur die letztere.

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

ich kompilieren mit:

gfortran -g example.c leaky.f90

Dann laufe ich mit:

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

Dann analysiere ich den raw.txt mtrace Ausgang mit:

mtrace a.out raw.txt

und erhalten:

Keine Speicherlecks.

Gibt es etwas, ich falsch mache, oder etwas, was ich tun kann, mtrace lassen Sie die undichte Zuordnung Fortran-Speicher finden? Ich denke, gfortran ist einen anderen malloc-Aufruf, die mtrace Spuren nicht ... In der Tat, wie ich oben geschrieben habe ich das gleiche Ergebnis, wenn ich ein Fortran-Haupt schreiben, die den (eingewickelt) mtrace() und muntrace() nennen würde.

EDITED: Ich andere Optionen in Betracht gezogen (darunter auch einige, die hier noch nicht erwähnt), aber der eigentliche Code auf P6 / AIX ausgetestet läuft wird, so Valgrind „nur“ unbequem sein würde (es muss auf einer anderen Maschine laufen zu lassen), während Forcheck wäre unpraktisch (es muss auf einer anderen Maschine laufen zu lassen) und teuer (~ $ 3k). Derzeit mtrace wäre die beste Lösung sein, wenn es funktioniert.

EDITED wieder: Meine Vermutung

  

Ich denke, gfortran einen anderen malloc Aufruf verwendet, die mtrace nicht verfolgen ...

richtig war. Ein Blick in die ausführbaren Datei (entweder mit nm oder readelf) gibt es keinen malloc() Anruf, aber _gfortran_allocate_array diejenigen - die vielleicht malloc nennen). Jede andere Ideen?

EDITED wieder: Ich gab die Antwort, aber ich kann es nicht (unbedingt akzeptieren http: //stackoverflow.uservoice. com / pages / general / Anregungen / 39426 und fordern sie die Funktion, es wirklich benötigt wird - kein Ruf gewinnen wollte)

War es hilfreich?

Lösung 3

Steve Kargl hatte die Antwort, die kurz ist, dass mtrace kein Leck hat, weil es keine undichte Stelle ist, wenn der Compiler der Norm entspricht: Siehe http://gcc.gnu.org/ml/fortran/2008-11/msg00163.html .

In der Tat Ich bin kein großer Fortran-Experte (Ich bin meistens C / C ++ / Java-Typ), und ich war auch mit einem anderen Compiler, der in einem solchen Zustand entweicht (das habe ich nicht erwähnen zu halten die Frage einfacher). So dachte ich fälschlicherweise, dass das Leck war es auch mit gfortran, was nicht der Fall ist (I mit Top-geprüft)

Andere Tipps

Ich bin kein Experte auf mtrace, so kann ich mit, dass nicht helfen. Ich würde vorschlagen, dass Sie versuchen, die valgrind Werkzeugspeicher-Lecks zu finden, wenn Sie ein unterstütztes System verwenden. Mit valgrind Speicher-Lecks zu finden, ist so einfach wie valgrind --leak-check=full ./a.out aufrufen.

Valgrind ist Linux nur. Für ein Fenster Produkt Forcheck suchen. http://www.forcheck.nl/features.htm

Ich habe Erfahrung mit Fortran Debuggen von Programmen, aber um ehrlich zu sein ich nicht wirklich verstehe Ihre Frage könnte. Ich denke, es ist, weil ich viel habe nicht von C / C ++ Debug-Erfahrung, die anders als Fortran. Trotzdem denke ich, das Sie profitieren:

, um die Intel-Compiler mit der folgenden Kompilierungsoptionen Mit fast jedem Speicherverlust, falsche Adresse Zugriff oder mit nicht initialisierten Zeigern / Variable während der Laufzeit erfassen.

Intel: -O0 -debug -traceback -check -ftrapuv

Für gfortran auch können Sie so ziemlich jede der oben genannten Fehler mit diesen Compiler-Optionen erhalten.

gfortran: -g -O0 -fbounds-Check -Wuninitialized

Es wird die Rückverfolgung von Unterprogramm drucken ruft, bis wo der Fehler auftritt. Es ist immer hilfreich, mit zwei unterschiedlichen Compiler zu kompilieren und in meiner Erfahrung werden Sie fast kein Speicherleck nach diesem.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top