mtrace для фортрановой программы - PullRequest
5 голосов
/ 04 ноября 2008

Я пытаюсь использовать 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 и запросите функцию, она действительно необходима - не нужно набирать репутацию)

Ответы [ 4 ]

1 голос
/ 16 февраля 2012

У меня есть опыт отладки программ на Фортране, но, честно говоря, я не совсем понял ваш вопрос. Я думаю, что это потому, что у меня нет большого опыта отладки C / C ++, который отличается от Fortran. Тем не менее, я думаю, что это принесет вам пользу:

Использование компилятора Intel со следующими параметрами компиляции позволит обнаружить практически любую утечку памяти, неправильный доступ к адресу или использование неинициализированного указателя / переменной во время выполнения.

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

Для Gfortran вы также можете получить любую из вышеперечисленных ошибок с этими опциями компилятора.

gfortran: -g -O0 -fbounds-check -Wuninitialized

Он будет печатать трассировку вызовов подпрограмм до тех пор, пока не произойдет ошибка. Всегда полезно компилировать с двумя разными компиляторами, и по моему опыту у вас почти не будет утечки памяти после этого.

1 голос
/ 04 ноября 2008

Valgrind только для Linux. Для продукта Windows посмотрите на Forcheck. http://www.forcheck.nl/features.htm

1 голос
/ 11 декабря 2008

Стив Каргл получил ответ, который вкратце заключается в том, что mtrace не обнаруживает утечек, потому что нет утечек, если компилятор соответствует стандарту: Подробнее см. http://gcc.gnu.org/ml/fortran/2008-11/msg00163.html.

На самом деле я не большой эксперт по фортрану (я в основном C / C ++ / java), и я также использовал другой компилятор, который протекает в таком состоянии (я не упомянул это, чтобы сохранить вопрос проще). Таким образом, я ошибочно думал, что утечка была также с gfortran, что не так (я проверил с верхом)

1 голос
/ 04 ноября 2008

Я не эксперт по mtrace, поэтому ничего не могу с этим поделать. Я бы посоветовал вам попробовать инструмент valgrind , чтобы найти утечки памяти, если вы используете поддерживаемую систему. Использование valgrind для обнаружения утечек памяти так же просто, как вызов valgrind --leak-check=full ./a.out.

...