mtrace für ein Fortran-Programm
-
06-07-2019 - |
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, diemtrace
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)
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.