문제

사용하려고합니다 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

오류가 발생할 때까지 서브 루틴 호출의 추적을 인쇄합니다. 항상 두 개의 다른 컴파일러로 컴파일하는 것이 도움이되며 내 경험상 그 후에는 메모리 누출이 거의 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top