mtrace для программы на языке Фортран
-
06-07-2019 - |
Вопрос
Я пытаюсь использовать 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неинициализированный
Он будет печатать обратную трассировку вызовов подпрограмм до тех пор, пока не произойдет ошибка.Всегда полезно скомпилировать двумя разными компиляторами, и, по моему опыту, после этого у вас почти не будет утечек памяти.