Fortran 프로그램을위한 Mtrace
-
06-07-2019 - |
문제
사용하려고합니다 mtrace
Fortran 프로그램에서 메모리 누출을 감지합니다. Gfortran 컴파일러를 사용하고 있습니다. Mtrace의 (Working) C 예에 대한 Wikipedia 항목을 참조하십시오. http://en.wikipedia.org/wiki/mtrace
예를 들어 Mtrace () 및 muntrace ()를 포장하고 Fortran 프로그램에서 전화를 걸고 MTRACE () 및 MUNTRACE ()을 직접 호출하는 C 프로그램을 만들어 낸다. 두 가지 접근 방식 모두 메모리 누출을 감지하지 못하지만 여기서는 후자 만 제시합니다.
예 .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
누출 된 Fortran 메모리 할당을 찾으십니까? Gfortran이 다른 것을 사용하고 있다고 생각합니다 malloc
전화, mtrace
추적하지 않습니다 ... 사실, 내가 위에서 쓴 것처럼, 나는 (포장)라고 부르는 Fortran 메인을 작성하면 동일한 결과를 얻습니다. mtrace()
그리고 muntrace()
.
편집 : 나는 다른 옵션을 고려했지만 (여기에 언급되지 않은 일부 포함), 실제 코드는 P6/AIX에서 실행되므로 Valgrind는 "단지"불편한 (다른 기계에서 실행 해야하는 반면)가 될 것입니다. 불편하고 (다른 기계에서 실행해야 함) 비싸고 (~ 3k $). 현재 MTRACE는 효과가 있다면 최상의 솔루션이 될 것입니다.
다시 편집 : 내 추측
Gfortran이 다른 것을 사용하고 있다고 생각합니다
malloc
전화,mtrace
추적하지 않습니다 ...
맞았다. 실행 파일을 조사합니다 ( nm
또는 readelf
) 아무것도 없습니다 malloc()
전화하지만 _gfortran_allocate_array
아마도 Malloc이라고 부를 것입니다). 다른 아이디어가 있습니까?
다시 편집 : 답변을 게시했지만 수락 할 수 없습니다 (이동 http://stackoverflow.uservoice.com/pages/general/suggestions/39426 기능을 요청하십시오. 실제로 필요합니다.
해결책 3
Steve Kargl은 대답을했습니다. 간단히 MTRACE가 누출을 찾지 못한다는 것입니다. 컴파일러가 표준을 준수하면 누출이 없기 때문에 : http://gcc.gnu.org/ml/fortran/2008-11/msg00163.html 자세한 내용은.
사실 저는 큰 Fortran 전문가가 아닙니다 (저는 대부분 C/C ++/Java Guy)이며 다른 컴파일러를 사용하고 있었는데 그러한 조건에서 누출이 발생했습니다 (질문을 더 쉽게 유지하기 위해 언급하지 않았습니다. ). 따라서 나는 실수로 유출이 Gfortran과 함께 있다고 생각했다.
다른 팁
나는 mtrace의 전문가가 아니므로 도움이되지 않습니다. 나는 당신이 시도 할 것을 제안합니다 Valgrind 지원되는 시스템을 사용하는 경우 메모리 누출을 찾는 도구. 메모리 누출을 찾기 위해 Valgrind를 사용하는 것은 호출만큼 간단합니다. valgrind --leak-check=full ./a.out
.
Valgrind는 Linux 전용입니다. Windows 제품의 경우 ForCheck을보십시오.http://www.forcheck.nl/features.htm
Fortran 프로그램 디버깅에 대한 경험이 있지만 솔직히 말하면 실제로 귀하의 질문을 이해할 수 없었습니다. Fortran과 다른 C/C ++ 디버깅 경험이 많지 않기 때문이라고 생각합니다. 그럼에도 불구하고 나는 이것이 당신에게 도움이 될 것이라고 생각합니다.
다음 컴파일 옵션과 함께 인텔 컴파일러를 사용하면 거의 모든 메모리 누출, 잘못된 주소 액세스 또는 런타임 중에 초기화 된 포인터/변수를 사용합니다.
인텔 : -o0 -debug -traceback -check -ftrapuv
Gfortran의 경우 이러한 컴파일러 옵션을 사용하여 위의 오류를 거의 얻을 수 있습니다.
gfortran : -g -o0 -fbounds -check -wuninitialized
오류가 발생할 때까지 서브 루틴 호출의 추적을 인쇄합니다. 항상 두 개의 다른 컴파일러로 컴파일하는 것이 도움이되며 내 경험상 그 후에는 메모리 누출이 거의 없습니다.