mtrace для фортрановой программы

Я пытаюсь использовать mtrace обнаруживать утечки памяти в программе на фортране. Я использую компилятор Gfortran. См. Статью в Википедии для (работающего) примера C mtrace: http://en.wikipedia.org/wiki/Mtrace

Я попробовал оба способа, то есть обернуть mtrace() и muntrace() и вызвать их из программы на языке fortran, а также создать программу на C, которая напрямую вызывает mtrace() и muntrace(), помимо утечки кода между ними. Оба подхода не смогут обнаружить утечку памяти, но здесь я представляю только последнее.

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.txtmtrace вывод с:

mtrace a.out raw.txt

и получить:

Нет утечек памяти.

Есть ли что-то, что я делаю неправильно, или что-то, что я могу сделать, чтобы позволить mtrace найти утечку памяти на Фортран? Я думаю, что Gfortran использует другой malloc вызов, который mtrace не отслеживает... На самом деле, как я уже писал выше, я получаю тот же результат, если я пишу фортрану, который будет вызывать (обернутый) mtrace() а также muntrace(),

РЕДАКТИРОВАНИЕ: я рассмотрел другие варианты (в том числе некоторые, которые еще не упомянуты здесь), но фактический отлаживаемый код работает на P6/AIX, поэтому Valgrind будет "просто" неудобен (его нужно запускать на другой машине), тогда как Forcheck будет неудобно (нужно запустить на другой машине) и дорого ( ~ 3к $). В настоящее время mtrace будет лучшим решением, если оно сработает.

Отредактировано снова: мое предположение

Я думаю, что Gfortran использует другой malloc вызов, который mtrace не отслеживает...

было правильно. Просмотр исполняемого файла (либо с nm или же readelf) нет никакого malloc() позвони, но _gfortran_allocate_array те, которые, возможно, будет называться malloc). Есть другие идеи?

Еще раз отредактировано: я опубликовал ответ, но не могу его принять (перейдите по адресу http://stackru.uservoice.com/pages/general/suggestions/39426 и запросите эту функцию, она действительно необходима - не требуется повышение репутации)

4 ответа

Решение

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

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

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

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

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

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

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

gfortran: -g -O0 -связать-проверить -Винициализировать

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

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

Другие вопросы по тегам