Я пытаюсь использовать mtrace
для обнаружения утечек памяти в программе на фортране. Я использую компилятор gfortran. См. Запись в Википедии для (рабочего) примера C mtrace: http://en.wikipedia.org/wiki/Mtrace
Я испробовал оба способа, то есть упаковав mtrace () и muntrace () и вызвав их из программы на языке fortran, а также создал программу на C, которая напрямую вызывает mtrace () и muntrace (), помимо утечек кода на fortran между.
Оба подхода не смогут обнаружить утечку памяти, но здесь я представляю только последний.
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
Я компилирую с:
gfortran -g example.c leaky.f90
Тогда я бегу с:
export MALLOC_TRACE=`pwd`/raw.txt; ./a.out
Затем я анализирую вывод raw.txt
mtrace
:
mtrace a.out raw.txt
и получите:
Нет утечек памяти.
Есть ли что-то, что я делаю неправильно, или что-то, что я могу сделать, чтобы mtrace
обнаружил утечку памяти на Фортране? Я думаю, что gfortran использует другой вызов malloc
, который mtrace
не отслеживается ...
На самом деле, как я уже писал выше, я получаю тот же результат, если я пишу фортран, который будет называть (обернутый) mtrace()
и muntrace()
.
РЕДАКТИРОВАНИЕ: Я рассмотрел другие варианты (в том числе некоторые, которые еще не упомянуты здесь), но сам отлаживаемый код работает на P6 / AIX, поэтому Valgrind будет "просто" неудобен (его нужно запускать на другой машине), тогда как Forcheck будет неудобным (он должен работать на другой машине) и дорогим (~ 3k $). В настоящее время mtrace будет лучшим решением, если оно сработает.
снова отредактировано:
Мое предположение
Полагаю, gfortran использует другой вызов malloc
, который mtrace
не отслеживается ...
было правильно. Если посмотреть на исполняемый файл (либо с nm
, либо с readelf
), то там не будет ни одного вызова malloc()
, а _gfortran_allocate_array
- который, возможно, будет вызывать malloc). Есть еще идеи?
ИЗМЕНЕНО снова:
Я опубликовал ответ, но не могу принять его (перейдите на http://stackoverflow.uservoice.com/pages/general/suggestions/39426 и запросите функцию, она действительно необходима - не нужно набирать репутацию)