Вопрос

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

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

пример.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();
}

дырявый.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 был бы неудобен ( его нужно запускать на другой машине) и дорого (~ 3 тыс. $).В настоящее время mtrace было бы лучшим решением, если бы оно работало.

еще раз отредактировано:Мое предположение

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

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

еще раз отредактировано:Я опубликовал ответ, но не могу его принять (перейдите к http://stackoverflow.uservoice.com/pages/general/suggestions/39426 и запросите эту функцию, она действительно нужна — никакой репутации не требуется)

Это было полезно?

Решение 3

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

На самом деле я не большой эксперт по Фортрану (я в основном разбираюсь в C/C++/java), и я также использовал другой компилятор, который ДЕЙСТВИТЕЛЬНО дает утечку в таких условиях (я не упомянул об этом, чтобы упростить вопрос). ).Таким образом, я ошибочно подумал, что утечка была и с gfortran, но это не так (проверил с помощью top)

Другие советы

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

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

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

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

информация:-O0 -debug -traceback -check -ftrapuv

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

гфортран:-g -O0 -fbounds-check -Wнеинициализированный

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top